使用Cython为Python编写更快的C扩展
使用Python很有趣,但有时,用它编写的程序可能很慢。所有的运行时动态调度会带来很大的代价:有时它比用C或Rust等系统语言编写的等效代码慢10倍。
将代码迁移到一种全新的语言可能会在成本和可靠性方面付出巨大代价:所有的手工重写工作都将不可避免地引入错误。我们可以两者兼得么?
为了练习一下优化,我们需要一些慢代码。有什么比斐波那契数列的意外指数实现更慢?
deffib(n):
ifn<2:
return1
returnfib(n-1)+fib(n-2)
由于对fib的调用会导致两次再次调用,因此这种效率极低的算法需要很长时间才能执行。例如,在我的新笔记本电脑上,fib(36)需要大约4.5秒。这个4.5秒会成为我们探索Python的Cython扩展能提供的帮助的基准。
使用Cython的正确方法是将其集成到setup.py中。然而,使用pyximport可以快速地进行尝试。让我们将fib代码放在fib.pyx中并使用Cython运行它。
>>>importpyximport;pyximport.install()
>>>importfib
>>>fib.fib(36)
只使用Cython而不修改代码,这个算法在我笔记本上花费的时间减少到大约2.5秒。几乎无需任何努力,这几乎减少了50%的运行时间。当然,得到了一个不错的成果。
加把劲,我们可以让它变得更快。
cpdefintfib(intn):
ifn<2:
return1
returnfib(n-1)+fib(n-2)
我们将fib中的代码变成用cpdef定义的函数,并添加了两个类型注释:它接受一个整数并返回一个整数。
这个变得快多了,大约只用了0.05秒。它是如此之快,以至于我可能开始怀疑我的测量方法包含噪声:之前,这种噪声在信号中丢失了。
当下次你的Python代码花费太多CPU时间时,也许会导致风扇狂转,为何不看看Cython是否可以解决问题呢?
以上内容为大家介绍了使用Cython为Python编写更快的C扩展,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。http://www.mobiletrain.org/
相关推荐HOT
更多>>python字符串和Java字符串
接下来,又到了Python字符串与Java字符串PK的时刻。Java中有比较字符串的方法,即compareTo()方法与equals()方法,前一个方法逐一比较两个字符...详情>>
2023-11-13 21:55:38七本经典python书籍
如果你想学习Python,市场上有许多可用的资源,本文我们为广大初学者们推荐7本最经典的Python书籍,这些书籍都非常受欢迎,你可以根据自己的需...详情>>
2023-11-13 21:07:28用Python的特性来切片无限生成器
注解推迟评估在Python3.7中,只要激活了正确的__future__标志,注解在运行时就不会被评估:from__future__importannotationsdefanother_brick(详情>>
2023-11-13 20:04:43Python实现文章自动生成
下面的Python程序实现了通过从网页抓取一篇文章,然后根据这篇文章来生成新的文章,这其中的原理就是基于概率统计的文本分析。过程大概就是网页...详情>>
2023-11-13 16:46:21