Cython之翻译小文一篇
为了响应赖神提倡的拜cython教,找了一份Pdf,翻译之.
此为初稿,所有的译注都用中括号加数字的方式,以便不影响阅读.
这篇”fast code with cython”的原档在这里,不满偶翻译的人,可以看看.
———-下面的猥琐的翻译文——————–
用cython写高效代码
作者:Robert Bradshaw 华盛顿大学 译者:小路
cython是什么?
Cython 可视作更多特性,优化过的Pyrex克隆版.开发目的主要来自Sage[1]的需求.
Pyrex是什么?
Pyrex可以让你写混合python和c类型的代码,如你想要的任何方式,并且可以把它编译成Python的C扩展.
—-Greg Ewing(作者)
Cython是什么?
- 可让C编译器 编译伪python代码
- 静态的类型声明对语言[2]进行扩展
- 可能极大提高速度
- 集成外部的库[3]
- 拥有python内存管理与python对象与C数据类型自动化相互转换的双重优点
为什么使用cython?
- 只优化你所需要的(部分)
- 最多的时间耗费在极少的代码上
- 容易集成
- 一般开发者即可编写[4]
- 可拼凑片段代码[5]
- 专注于算法
- ……而不是刻板印象中讨厌的,乏味的,容易出错的代码[6]
- 可使用来自Sage或其他地方的一切
- 易于阅读
- 一致性
cython 可以加快我的 Pari/Magma/纯Python代码,以便完全列举出实数域 by a factor 20-100.
这样巨大的计算量—-总共大约需要几个CPU months,切分到分布式计算环境—–速度的提升是决定要素,
使我把看起来不可能的项目变成可能.
——-John Voight
在Sage中使用Cython
- 命令行
- 加载或附加.spyx扩展到sage脚本
- 在sage代码中
- 创建.pyx扩展文件并加入到setup.py
- 也可以是.pxd文件和pxi文件[7]
- 在notebook中[8]
- 直接或者交互的使用%cython块.
实例部分
cython vs python
定理
python是对开发者来说,易用的语言.
事实
python比较慢.
python慢的原因是:
- 它是解释器
- cython是编译性的
- 查找字典
- cython有cdef attributes[9]
- 及其复杂的调用约定
- cython有cdef functions
- 以对象为基础
- cython有cdef types
快速循环
用 for … from 代替 range()
性能测试
以上提升一百倍的速度
魔幻关键字cdef
关键字cdef可用作:
cdef关键字也可以通过接口使用外部库.
cdef的缺陷
cdef不完全具备python的访问性.
- cdef public attributes
- cpdef functions
但有时你想使用private(不行)[10]
常见隐患
[1].Sage是一个开源的数学软件,cython文档有一章专门介绍如何跟numpy包(python的数学库)配合
[2].静态的类型声明指用cdef可声明C语言类型,如int,float等,也可以声明python对象(如:cdef Class1 obj).此处语言指python语言.
[3].比如cython可及其方便的使用C语言的库
[4].这里是说,不需要高级技术人员,一般的python开发者即可开发.
[5].可以一小段就写成一个扩展,毫不费劲.隐含意思是,随时即可优化.
[6].指C写的扩展.
[7].pxd是新式用法,pxi是老式用法,pxd相当于c语言中的.h文件,而.pyx文件相当于.c文件.
[8].指sage notebook
[9].cdef属性,不翻译更便于理解.
[10].可编译通过,但会抛出异常.







