本文共 1694 字,大约阅读时间需要 5 分钟。
python cython
Python是当今使用的最之一,并且有充分的理由:它是开源的,具有广泛的用途(例如Web编程,业务应用程序,游戏,科学编程等等),并且有一个充满活力和敬业精神的社区来支持它。 这个社区的原因是我们在 (PyPI)中拥有如此众多,种类繁多的软件包,以扩展和改进Python并解决不可避免的小问题。
,一种简化了为Python编写C扩展的语言。Python使用起来很有趣,但是有时用它编写的程序可能会很慢。 所有的运行时动态调度都付出了高昂的代价:有时,它的速度比用C或Rust这样的系统语言编写的等效代码慢10倍。
将代码段迁移到全新的语言可能会付出巨大的努力和可靠性,这一切:手动重写工作将不可避免地引入错误。 我们可以吃蛋糕吗?
为了使本练习有一些优化,我们需要一些缓慢的东西。 有什么比斐波那契数列的意外指数实现慢的呢?
def fib ( n ) : if n < 2 : return 1 return fib ( n- 1 ) + fib ( n- 2 )
由于对fib的调用导致两次调用,因此这种效率低下的算法执行起来需要很长时间。 例如,在我的新笔记本电脑上, fib(36)大约需要4.5秒。 这4.5秒将是我们的基线,因为我们将探索Python的Cython扩展如何提供帮助。
使用Cython的正确方法是将其集成到setup.py中 。 但是,尝试快速简便的方法是pyximport 。 让我们将上面的fib代码放在fib.pyx中 ,然后使用Cython运行它。
>>> import pyximport ; pyximport. install ( ) >>> import fib >>> fib. fib ( 36 )
仅使用Cython而无需更改代码,就可以将算法在笔记本电脑上花费的时间减少到2.5秒左右。 毫不费力地将运行时间减少了近50%。 当然,可以吃到的美味蛋糕!
付出更多的努力,我们可以使事情变得更快。
cpdef int fib ( int n ) : if n < 2 : return 1 return fib ( n - 1 ) + fib ( n - 2 )
我们将fib中的代码移到了使用cpdef定义的函数中,并添加了两个类型注释:它需要一个整数并返回一个整数。
这使得它更快 ,0.05左右秒。 太快了,我可能开始怀疑我的测量方法中是否包含噪声:以前,这种噪声已在信号中丢失。
因此,下次您的某些Python代码在CPU上花费的时间过长时,也许在此过程中增加了一些支持者,为什么不看看Cython是否可以解决问题呢?
在本系列的下一篇文章中,我们将研究Black ,该项目会自动纠正代码中的格式错误。
翻译自:
python cython
转载地址:http://dvbzd.baihongyu.com/