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()

range

loop

性能测试

benchmark

以上提升一百倍的速度

 

 

魔幻关键字cdef

 

关键字cdef可用作:

  • 局部变量声明
  • 函数声明
    • cdef methods
    • local

    • cdef attitudes
    • function

cdef关键字也可以通过接口使用外部库.

 

cdef的缺陷

cdef不完全具备python的访问性.

  • cdef public attributes
  • cpdef functions

但有时你想使用private(不行)[10]

 

常见隐患

  • 过多的python
  • too_much

  • 不必要的转换
  • convertion

  • 无类型的对象
  • untype_object

     

     

     

     

     

     

[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].可编译通过,但会抛出异常.

Leave a comment

Your comment

Comment spam protected by SpamBam