使用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
更多>>
pythonfor循环是什么
pythonfor循环是什么在做遍历的时候,对于一些数据的反复循环执行,我们会用到for循环的语句。可以说这是新手入门必学的语句之一,在很多基础循...详情>>
2023-11-13 07:46:36
pythoncontextmanager()的转换
python中contextmanager()的转换1、说明当发出请求时,requests库会在将请求实际发送到目标服务器之前准备该请求。请求准备包括像验证头信息和...详情>>
2023-11-13 06:34:35
python使用items()遍历键值对
python使用items()遍历键值对字典可以用来存储各种方式的信息,所以有很多方式可以通过字典的所有键值对、键或值。说明1、即使通过字典,键值对...详情>>
2023-11-13 04:24:15
python实例方法中self的作用
python实例方法中self的作用说明1、无论是创建类的构造方法还是实例方法,最少要包含一个参数self。2、通过实例的self参数与对象进行绑定,程序...详情>>
2023-11-13 03:46:48