Cython Speed Boost与可用性

时间:2010-04-23 08:48:53

标签: python performance cython

我刚遇到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有任何可靠性问题吗?

7 个答案:

答案 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"

并编译它,我得到以下时间:

  • 纯Python代码: 20.4553578737秒
  • Cython代码: 0.199339860234秒

这是一个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

    • Cython 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

谢谢..