- %%cython
- cpdef long fib_cython_type(long n):
- if n<2:
- return n
- return fib_cython_type(n-1)+fib_cython_type(n-2)
如不雅应用 Anaconda,安装会有所不合。因为安装有点复杂,所以我编写了一篇相干的博客文┞仿:将 Cython For Anaconda 安装在 Windows 上
安装后,我们应用神奇的 %load_ext 将 Cython 加载到 Notebook 中:
- %load_ext Cython
然后就可以在我们的 Notebook 中编译代码。我们只须要将想要编译的代码放在一个单位中,包含所需的导入语句,应用神奇的 %%cython 启动该单位:
- %%cython
- def fib_cython(n):
- if n<2:
- return n
- return fib_cython(n-1)+fib_cython(n-2)
履行该单位会无缝地编译这段代码。我们为该函数应用一个稍微不合的名称,以反竽暌钩出它是应用 Cython编译的。当然,一般不须要这么做。我们可以将之前的函数调换为雷同名称的已编译函数。
对它计时会获得:
- 1000 loops, best of 3:1.22 ms per loop
哇,几乎比最初的 Python 代码快 3 倍!我们如今比应用 BigInt 的 Julia 快 100 倍。
我们还可以测验测验静态类型。应用关键字 cpdef 而不是 def 来声明该函数。它使我们可以或许应用响应的 C 类型来键入函数的参数。我们的代码变成了:
履行该单位后,对它计时会获得:
- 10000 loops, best of 3:36 µs per loop
太棒了,我们如今只花费了 36 微秒,比最初的基准测试快约 100 倍!这与 Julia 所花的 80 毫秒比拟更出色。
有人可能会说,静态类型违背了 Python的用处。一般来讲,我比较赞成这种说法,我们稍后将查看一种在不就义机能的情况下避免这种情况的办法。但我并不认为这是一个问题。Fibonacci函数必须应用整数来调用。我们在静态类型中掉去的是 Python 所供给的随便率性精度。对于 Fibonacci,应用 C 类型 long
所有 Julia 基准测试都与运行时光有关。这是 Julia 中应用和不应用 BigInt 的计时:
会限制输入参数的大年夜小,因为太大年夜的参数会导致整数溢出。
请留意,Julia 计算也是应用 64 位整数履行的,是以将我们的静态类型版本与 Julia 的比较是公平的。
还不错,但我们可以应用 Numba 做得更好。不幸的是,Numba 还不会编译列表推导式 (list
缓存计算
我们在保存 Python 随便率性精度的情况下能做得更好。fib 函数反复履行同一种枷⒚很多次。例如,fib(20) 将调用 fib(19) 和fib(18)。fib(19) 将调用 fib(18) 和 fib(17)。结不雅 fib(18) 被调用了两次。简单分析注解,fib(17) 将被调用 3 次,fib(16) 将被调用 5 次,等等。
推荐阅读
Aporeto是一家“云原生”的安然始创公司,旨在确保那些不受信的IT情况的安然性。该公司方才在A轮融资——也就是岁尾产品宣布之前——获得了>>>详细阅读
地址:http://www.17bianji.com/lsqh/35343.html
1/2 1