Cython速度提升与可用性
我最近发现了Cython,正好在寻找优化Python代码的方法。我在Stack Overflow、Python的维基和一篇名为“优化的一般规则”的文章上阅读了很多内容。
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)
$ time python test.pyx
real 0m16.774s
user 0m16.745s
sys 0m0.024s
$ time cython test.pyx
real 0m0.513s
user 0m0.196s
sys 0m0.052s
老实说,我很震惊。我这里用的代码完全是Python代码,我唯一改变的就是解释器。在这种情况下,如果Cython这么好,那为什么人们还在使用传统的Python解释器呢?Cython有没有什么可靠性的问题呢?
7 个回答
cython test.pyx
其实并不会直接运行你的程序。这个cython
命令是用来把你的 Cython 代码处理成一个 Python 扩展模块。你需要在 Python 中导入它才能运行。#!/usr/bin/python
这个开头的写法并不是最好的选择。一般来说,#!/usr/bin/env python
更受欢迎,因为它会运行命令行中设置的任何python
版本。- Cython 的
pyx
文件通常不应该有这个开头,除非它们确实是有效的 Python 程序。
- Cython 的
你发布的代码中有一个缩进错误。
使用传统的解释器更简单,也更容易移植。Cython 是可靠的,但也有一些限制和小问题。如果 Cython 能像你的时间测试显示的那样神奇地加速,那当然很吸引人,但实际上它的加速效果并没有那么明显。要想看到明显的加速,你需要开始使用 Cython 特有的功能来利用 C 语言的特性。
Cython 不是另一个解释器。它是用来从类似 Python 的代码生成 C 扩展的工具。你输入 cython test.pyx
这条命令时,它只会生成一个 'test.c' 文件,等这个文件编译完成后,就可以像普通的 Python 库一样被 Python 使用。
这意味着你测量的只是 Cython 把你的 Python 代码转换成 C 代码所花的时间,并不是你代码运行的速度。
其他回答已经解释了你只是编译了Cython代码,而不是执行它。不过,我想你可能会想知道Cython能让你的代码快多少。当我用distutils
编译你提供的代码(虽然我是在不同的模块中运行这个函数)时,发现速度提升非常有限,大约只有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"
然后编译后,我得到了以下的运行时间:
- 纯Python代码:20.4553578737秒
- Cython代码:0.199339860234秒
这意味着速度提升了100倍,真不错。