可以看到,大年夜部分时光都花费在了生成随机数上。我不肯定则是不是该基准测试的意图。
- from functools import lru_cache as cache
- @cache(maxsize=None)
- def fib_cache(n):
- if n<2:
- return n
- return fib_cache(n-1)+fib_cache(n-2)
加快此测试的一种方法是应用 Numpy 将随机数生成移到轮回之外。我们一次性创建一个随机数数组。
对它计时会获得:
- 1000 loops, best of 3:848 µs per loop
还不错,快了 4 倍,接近于 Cython 代码的速度。
拥稀有组后,经由过程轮回它来一次向某个元素应用 hex() 和 int() 函数似乎很傻。好消息是,Numpy 供给了一种向数组应用函数的办法,而不必使悠揭捉?环,该函数是numpy.vectorize() 函数。此函数接收一次处理一个对象的函数。它返回一个处理数组的新函数。
- vhex = np.vectorize(hex)
- vint = np.vectorize(int)
- def parse_int_numpy():
- n = np.random.randint(0,2**32-1,1000)
- s = vhex(n)
- m = vint(s,16)
- np.all(m == n)
- return s
此代码运行速度更快了一点,几乎像 Cython 代码一样快:
- 1000 loops, best of 3:703 µs per loop
我肯定 Python 专家可以或许比我在这里做得更好,因为我不太熟悉 Python 解析,但这再一次注解避免 Python 轮回是个不错的设法主意。
停止语
膳绫擎介绍了若何加快 Julia 团队所应用的 4 个示例的运行速度。还有 3 个例子: