博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python cython_使用Cython为Python编写更快的C扩展
阅读量:2530 次
发布时间:2019-05-11

本文共 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/

你可能感兴趣的文章
第10章 系统级I/O(下)
查看>>
mysql foreign key(外键) 说明与实例
查看>>
二叉树的非递归遍历
查看>>
android中Activity布局以及实例
查看>>
jsp中常用操作字符串的el表达式
查看>>
element-ui <el-input> 注册blur事件
查看>>
HTML5须知的特征和技术
查看>>
HTTP请求方式GET和POST的区别详解
查看>>
Python02_流程控制及数据结结构
查看>>
记录一个数据表联合查询过慢的“小坑”
查看>>
Java中的long与double的区别
查看>>
只出现一次的数字 [ LeetCode ]
查看>>
动手动脑3
查看>>
Oracle笔记之用户管理
查看>>
margin的相关属性:
查看>>
20145231熊梓宏 《网络对抗》 实验8 Web基础
查看>>
saas系统架构经验总结
查看>>
实现Icommand接口
查看>>
多用户ATM机(面向对象编程)
查看>>
Linux下管理软件的方法
查看>>