我刚遇到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)
$ 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有任何可靠性问题吗?
答案 0 :(得分: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"
并编译它,我得到以下时间:
这是一个100倍的加速。不是太破旧。
答案 1 :(得分:18)
Cython不是另一个翻译。它从python(类似)代码生成python的c扩展。 cython test.pyx
只会生成一个'test.c'文件,python可以像普通的python库一样使用它(一旦编译完成)。
这意味着您只测量cython将您的python代码转换为c所需的时间,而不是该代码版本的运行速度。
答案 2 :(得分:9)
cython test.pyx
实际上并不运行您的程序。 cython
二进制文件用于将Cython代码处理为Python扩展模块。您必须在Python中导入它才能运行它。
#!/usr/bin/python
不是Python脚本最好的shebang系列。通常首选#!/usr/bin/env python
,它运行命令行上的任何python
。
pyx
文件根本不应该有一个shebang行,除非它们是有效的Python程序。发布的代码中有一个IndentationError。
使用传统的解释器更简单,更便携。 Cython是可靠的,但有其局限性和怪癖。如果神奇地给你的加速时间让它看起来像那样,那么使用它可能会更有吸引力,但它实际上会给出较小的加速度。您必须开始使用特定于Cython的功能来使用C功能来查看大量的加速。
答案 3 :(得分:9)
似乎缺少一个重点:Cython不是Python的严格超集。 Python支持一些功能,但Cython没有。最值得注意的是,发电机和lambdas(但它们即将到来)。
答案 4 :(得分:2)
最大的原因Cython不那么受欢迎,因为它缺少独立的(没有python)可执行文件。
缺乏宣传。开发人员似乎对开发他们的Sage软件更感兴趣,而不是尖端语言。
开发过程中遇到的陷阱。我遇到的一个是缺乏真正的线程支持。一切都包含在一个全局解释器锁中,使其线程安全,但禁用并发!
答案 5 :(得分:2)
对于那些希望cython实际编译并在一行中运行程序的人,我创建了runcython(http://github.com/russell91/runcython)。 runcython test.pyx
将具有OP预期的语义
答案 6 :(得分:-1)
正如许多评论暗示你提到cython的时间只是将.py文件转换为.c文件所花费的时间。那个.c文件将是大内存。优点是您可以使用C编译器编译该.c文件
我会举一个例子: 如果你有一个python文件,我们需要存储为.pyx文件。通过运行“ cython xyz.pyx ”,它将创建.c和.so文件
让我们检入图片files created by cython command
在我的情况下,大小也会增加字节更改为 Kb
有一些特定的方法来编译python代码 你可以参考这个链接:
http://cython.readthedocs.io/en/latest/src/reference/compilation.html https://rajeshrinet.github.io/blog/2014/cython/
我注意到的另一件事是他们没有提到cython中的内存问题 当我尝试在我的嵌入式项目中实现时。我面临很多内存问题。
你可以尝试pypy在没有必要加倍编译的情况下,编译时间也减少了时间
参考图片: compare time between python and pypy
谢谢..