Python Cython速度提升vs.可用性

Python Cython速度提升vs.可用性,python,performance,cython,Python,Performance,Cython,我刚刚遇到Cython,当时我正在寻找优化Python代码的方法。我阅读了关于堆栈溢出、python wiki的各种帖子,并阅读了文章“优化的一般规则” 赛顿是我最感兴趣的东西;您可以选择在python代码中包含其他数据类型,而不是自己编写C代码 这是我试过的一个愚蠢的测试 #!/usr/bin/python # test.pyx def test(value): for i in xrange(value): i**2 if(i==1000000): p

我刚刚遇到Cython,当时我正在寻找优化Python代码的方法。我阅读了关于堆栈溢出、python wiki的各种帖子,并阅读了文章“优化的一般规则”

赛顿是我最感兴趣的东西;您可以选择在python代码中包含其他数据类型,而不是自己编写C代码

这是我试过的一个愚蠢的测试

#!/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
real    0m0.513s 
user    0m0.196s 
sys     0m0.052s
$time cython test.pyx

real    0m16.774s 
user    0m16.745s
sys     0m0.024s
real    0m0.513s 
user    0m0.196s 
sys     0m0.052s

现在,老实说,我目瞪口呆。我在这里使用的代码是纯python代码,我所做的更改是解释器。在这种情况下,如果cython这么好,那么为什么人们仍然使用传统的Python解释器呢?Cython是否存在可靠性问题?

Cython不是另一个解释器。它从python(-like)代码生成python的c扩展
cython test.pyx
将只生成一个“test.c”文件,python可以像普通python库一样使用该文件(编译后)

这意味着您只测量cython将python代码翻译为c所需的时间,而不是该版本代码的运行速度。

  • cythontest.pyx实际上并不运行您的程序。
    cython
    二进制文件用于将cython代码处理到Python扩展模块中。您必须在Python中导入它才能运行它

  • #/usr/bin/python
    不是python脚本的最佳shebang行<代码>#/通常首选usr/bin/env-python
    ,它在命令行上运行
    python
    将运行的任何东西

    • Cython
      pyx
      文件可能根本不应该有shebang行,除非它们是有效的Python程序
  • 您在发布的代码中有一个缩进错误

  • 使用传统的解释器更简单,更便于携带。Cython是可靠的,但也有其局限性和怪癖。如果它能神奇地加速你的计时,让它看起来像它一样,那么使用它可能会更有吸引力,但实际上它会带来更小的加速。你必须开始使用Cython特有的特性,才能使用C特性来看到大量的加速


其他答案已经解释了您是如何编译Cython代码,而不是执行它的。然而,我想你可能想知道Cython能让你的代码快多少。当我编译您使用的代码(尽管我从另一个模块运行函数)时,与纯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"
def测试(长-长值):
龙龙一号
长z
对于x范围内的i(值):
z=i**2
如果(i==1000000):
打印i
如果z
编译后,我得到了以下几次:

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

这是100倍的加速。不太破旧。

似乎遗漏了一个要点:Cython不是Python的严格超集。Python支持一些特性,但Cython不支持。最值得注意的是,发电机和lambda(但它们即将问世)。

  • Cython不那么流行的最大原因是它缺少独立的(没有python)可执行文件

  • 缺乏宣传。开发人员似乎对开发他们的Sage软件比开发尖端语言更感兴趣

  • 开发过程中遇到的陷阱。我遇到的一个问题是缺乏真正的线程支持。所有内容都封装在一个全局解释器锁中,使其线程安全,但禁用并发性


对于那些希望cython在一行中编译并运行您的程序的人,我创建了runcython()
runcythontest.pyx
将具有OP想要的语义

,因为许多注释表明您在cython中提到的时间只是将.py文件转换为.c文件所花费的时间。该.c文件将占用大量内存。优点是您也可以使用c编译器编译该.c文件

我举一个例子: 如果您有python文件,我们需要将其存储为.pyx文件。通过运行“cython xyz.pyx”,它将创建.c和.so文件

让我们登记一下照片

在我的例子中,大小也会增加,它将字节更改为Kb

有一些特定的方法来编译python代码 您可以参考以下链接:

我注意到的另一件事是,他们没有提到cython中的记忆问题 当我尝试在我的嵌入式项目中实现时,我面临着很多内存问题

您可以尝试pypy,在那里不需要花费额外的精力来编译,并且在编译时间方面也减少了时间

参考图片:


谢谢..

这可能是以正确性为代价的。Python代码计算
i**2
的正确值。如果您正在编译32位代码,则C代码会溢出执行该操作的大多数数字。(如果它真的执行了这个操作。可以想象,你的C编译器完全优化了这个操作。)这可能不是一个公平的比较。你也没有完全弄清楚你在跑什么,你是如何跑的,以及你给这些时间的时间是什么。顺便说一句,这就是我所说的“怪癖”。我几乎提供了一个溢出的例子,比如Python代码自动执行检查以确保正确性,这样在C语言中就会无声地失败。我在做这件事的时候想到了溢出,但我很懒,因为我知道在这种情况下这并不重要。我将修复它以使用long-longs。@JustinPeel我有一个问题,您可以提供关于.G的见解