43

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

Cython 是我最感兴趣的东西。您可以选择在 Python 代码本身中包含其他数据类型,而不是自己编写 C 代码。

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

#!/usr/bin/python
# test.pyx
def test(value):
    for i in xrange(value):
    i**2
    if(i==1000000):
        print i

test(10000001)

$ 时间 python test.pyx

real    0m16.774s 
user    0m16.745s
sys     0m0.024s

$ 时间 cython test.pyx

real    0m0.513s 
user    0m0.196s 
sys     0m0.052s

现在,老实说,我傻眼了。我在这里使用的代码是纯python代码,我改变的只是解释器。在这种情况下,如果 cython 这么好,那为什么人们还用传统的 Python 解释器呢?Cython 是否存在任何可靠性问题?

4

7 回答 7

55

其他答案已经解释了您如何编译 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 倍的加速。不是太寒酸。

于 2010-04-23T16:11:12.047 回答
18

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

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

于 2010-04-23T10:17:46.187 回答
10
  • cython test.pyx实际上并没有运行你的程序。该cython二进制文件用于将您的 Cython 代码处理为 Python 扩展模块。您必须在 Python 中导入它才能运行它。

  • #!/usr/bin/python不是 Python 脚本的最佳 shebang 行。#!/usr/bin/env python通常是首选,它运行python命令行上的任何内容。

    • Cythonpyx文件可能根本不应该有 shebang 行,除非在极端情况下它们是有效的 Python 程序。
  • 您在发布的代码中有一个 IndentationError 。

  • 使用传统的解释器更简单,更便携。Cython 是可靠的,但有其局限性和怪癖。如果它神奇地让你的时间看起来像它一样的加速,那么使用它可能会令人信服,但它实际上提供了更小的加速。您必须开始使用 Cython 特定的功能才能使用 C 功能才能看到很多加速。

于 2010-04-23T14:30:57.750 回答
9

似乎遗漏了一个重点:Cython 不是 Python 的严格超集。Python 支持某些功能,但 Cython 不支持。最值得注意的是,生成器和 lambdas(但它们即将到来)。

于 2010-06-08T00:29:51.040 回答
3
  • Cython 不那么受欢迎的最大原因是它缺乏独立的(没有 python)可执行文件。

  • 缺乏宣传。与尖端语言相比,开发人员似乎是对开发 Sage 软件更感兴趣的学者。

  • 开发过程中遇到的陷阱。我遇到的一个是缺乏真正的线程支持。一切都包裹在一个全局解释器锁中,使其成为线程安全的,但禁用了并发性!

于 2010-12-15T00:01:04.283 回答
2

对于希望 cython 在一行中实际编译和运行程序的任何人,我创建了 runcython ( http://github.com/russell91/runcython )。runcython test.pyx将具有 OP 预期的语义

于 2015-03-20T23:44:38.180 回答
0

许多评论表明您提到的 cython 只是将 .py 文件转换为 .c 文件所花费的时间。该 .c 文件将是很大的内存。优点是您也可以使用 C 编译器编译该 .c 文件

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

让我们签入 由 cython 命令创建的图片文件

在我的情况下,大小也增加了,它从Bytes更改为Kb

有一些特定的方法可以编译 python 代码,你可以参考这个链接:

http://cython.readthedocs.io/en/latest/src/reference/compilation.html https://rajeshrinet.github.io/blog/2014/cython/

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

可以试试 pypy 不需要额外努力编译的地方,编译时间也减少了

参考图片: 比较python和pypy的时间

谢谢..

于 2018-04-03T06:25:55.547 回答