我信赖,应当在更复杂的代码上对说话履行基准测试。Python 与 Julia 比较–一个来自机械进修的示例中供给了一个不错的示例。在该文┞仿中,Julia 似乎优于 Cython。如不雅我有时光,我会应用 Numba试一下。
在 Python 3 中,我们可以应用 functools 标准库来避免这些反复的计算。
结不雅为:
请留意,此代码应用了 Python 同时分派两个局部变量的才能。对它计时会获得:
对此函数计时会获得:
- 1000000 loops, best of 3:910 ns per loop
速度又增长了 40 倍,比最初的 Python 代码快约 3,600 倍!推敲到我们仅向递归函数添加了一条注释,此结不雅异常令人难忘。
Python 2.7 中没有供给这种主动缓存。我们须要显式地转换代码,才能避免这种情况下的反复计算。
- 1000000 loops, best of 3:1.77 µs per loop
我们又快了 20 倍!让我们在应用和不应用静态类型的情况下编译我们的函数。请留意,我们应用了 cdef 关键字来键入局部变量。
- %%cython
- def fib_seq_cython(n):
- if n < 2:
- return n
- a,b = 1,0
- for i in range(n-1):
- a,b = a+b,a
- return a
- cpdef long fib_seq_cython_type(long n):
- if n < 2:
- return n
- cdef long a,b
- a,b = 1,0
- for i in range(n-1):
- a,b = a+b,b
- return a
我们可在一个单位中对两个版本计时:
- %timeit fib_seq_cython(20)
- %timeit fib_seq_cython_type(20)
- 1000000 loops, best of 3:953 ns per loop
- 10000000 loops, best of 3:51.9 ns per loop
静态类型代码如今花费的时光为 51.9 纳秒,比最初的基准测试快约 60,000(六万)倍。
如不雅我们想计算随便率性输入的 Fibonacci 数,我们应保持应用无类型版本,该版本的运行速度快 3,500 倍。还不错,对吧?
应用 Numba 编译
让我们应用另一个名为 Numba 的对象。它是针对部分 Python 版本的一个即时
(jit) 编译器。它不是对所有 Python 版本都实用,但在实用的情况下,它会带来事业。