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

来源:千锋教育
发布时间:2023-11-06 06:52:17
分享

使用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培训机构:千锋教育。https://www.mobiletrain.org/

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • Python机器学习之AdaBoost算法 算法概述AdaBoost是英文AdaptiveBoosting(自适应增强)的缩写,由YoavFreund和RobertSchapire在1995年提出。AdaBoost的自适应在于前一个基本分类器分
  • Python对象的创建 python会用两种方法创建对象,一种是泛型API(AOL:AbstractObjectLayer),可以应用在任何Python对象上,API内不会有机制确定最终调用哪个具体函数,比如PyObject
  • Python中的对象 Python中一切皆是对象。————GuidovanRossum(1989)这句话只要你学过python,你就很有可能在你的Python学习之旅的前30分钟就已经见过了,但是这句话具体是什么意思呢?一
  • Python的元组 什么是python元组?java中可没有听过内置元组这样的数据结构。在前面已经讲了列表,知道一个列表可以存储多个数据结构。元组和列表很像,但要记住它们间的一个重要区别:元组是不可变的。如何创建元组?把
  • Python类和对象 刚接触python中的类和对象,我也和大多数小伙伴一样迷茫,不知道它和我所熟知的java都有什么异同点,为此我还提出了一大堆问题如何创建和实例化类?是否和java一样有访问修饰符,分为几个级别?构造函
  • Python 性能剖分工具 眼看着项目即将完成,却被测试人员告知没有通过性能测试,这种情况在开发中屡见不鲜。接下来的工作就是加班加点地找出性能瓶颈,然后进行优化,再进行性能测试,如此这般周而复始直到通过性能测试。尽管丰富的工作经