我刚遇到Cython,而我正在寻找优化Python代码的方法.我在stackoverflow,python wiki上阅读了各种帖子,并阅读了文章"优化的一般规则".
Cython是最能引起我兴趣的东西; 而不是为自己编写C代码,您可以选择在python代码本身中使用其他数据类型.
这是我试过的一个愚蠢的测试,
#!/usr/bin/python
# test.pyx
def test(value):
for i in xrange(value):
i**2
if(i==1000000):
print i
test(10000001)
Run Code Online (Sandbox Code Playgroud)
$ time python test.pyx
real 0m16.774s
user 0m16.745s
sys 0m0.024s
Run Code Online (Sandbox Code Playgroud)
$ time cython test.pyx
real 0m0.513s
user 0m0.196s
sys 0m0.052s
Run Code Online (Sandbox Code Playgroud)
现在,老实说,我傻眼了.我在这里使用的代码是纯python代码,我所有改变的是解释器.在这种情况下,如果cython这样好,那么为什么人们仍然使用传统的Python解释器呢?Cython有任何可靠性问题吗?
Jus*_*eel 53
其他答案已经解释了你是如何编译Cython代码而不是执行它的.但是,我想你可能想知道Cython可以让代码快多少.当我编译你拥有的代码(虽然我从不同的模块运行函数)时distutils
,我获得了比直接Python更快的速度 - 大约1%.但是,当我在代码中添加一些小的更改时:
def test(long long value):
cdef long long i
cdef long long z
for i in xrange(value):
z = i**2
if(i==1000000):
print i
if z < i:
print "yes"
Run Code Online (Sandbox Code Playgroud)
编译它,我有以下几次:
这是一个100倍的加速.不是太寒酸.
Ste*_*ven 18
Cython不是另一个翻译.它从python(类似)代码生成python的c扩展.cython test.pyx
将只生成一个'test.c'文件,它(一旦编译完成)可以被python使用,就像普通的python库一样.
这意味着您只测量cython将您的python代码转换为c所需的时间,而不是该代码版本的运行速度.
cython test.pyx
实际上并没有运行你的程序.该cython
二进制文件是处理你用Cython代码转换为Python扩展模块.您必须在Python中导入它才能运行它.
#!/usr/bin/python
不是Python脚本最好的shebang系列.#!/usr/bin/env python
通常是首选,它运行python
命令行上的任何操作.
pyx
文件可能根本不应该有一个shebang行,除非它们是有效的Python程序.发布的代码中有IndentationError.
使用传统的解释器更简单,更便携.Cython是可靠的,但有其局限性和怪癖.如果神奇地给你的加速时间让它看起来像那样,那么使用它可能会更有吸引力,但它实际上会给出更小的速度.您必须开始使用特定于Cython的功能来使用C功能来查看大量的加速.
似乎缺少一个重点:Cython不是Python的严格超集.Python支持一些功能,但Cython没有.最值得注意的是,发电机和lambdas(但它们即将到来).
归档时间: |
|
查看次数: |
26926 次 |
最近记录: |