python cython_使用Cython为Python编写更快的C扩展

python cython

Python是当今使用的最流行的编程语言之一,并且有充分的理由:它是开源的,具有广泛的用途(例如Web编程,业务应用程序,游戏,科学编程等等),并且有一个充满活力和敬业精神的社区来支持它。 这个社区的原因是我们在Python软件包索引 (PyPI)中拥有如此众多,种类繁多的软件包,以扩展和改进Python并解决不可避免的小问题。

Cython ,一种简化了为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 ,该项目会自动纠正代码中的格式错误。

翻译自: https://opensource.com/article/19/5/python-cython

python cython

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值