【发布时间】:2013-01-24 09:13:25
【问题描述】:
我有这个 cython 代码只是为了测试:
cimport cython
cpdef loop(int k):
return real_loop(k)
@cython.cdivision
cdef real_loop(int k):
cdef int i
cdef float a
for i in xrange(k):
a = i
a = a**2 / (a + 1)
return a
我用这样的脚本测试了这个 cython 代码和纯 python 中的相同代码之间的速度差异:
import mymodule
print(mymodule.loop(100000))
我的速度提高了 80 倍。但是如果我删除 cython 代码中的两个 return 语句,我会快 800-900 倍。为什么 ?
另一件事是,如果我在旧的 ACER Aspire ONE 笔记本上运行此代码(返回),我的速度会快 700 倍,而在家里的新台式 i7 PC 上,速度会快 80 倍。
有人知道为什么吗?
【问题讨论】:
-
很难说——我想知道编译器是否足够聪明,可以看到
real_loop不会更新任何全局变量,也不会更改任何参数,所以它可以变成无操作。 -
你试过
diff这两个生成的C文件看看有什么不同吗?无论如何,也许是因为 cython 看到没有return的函数是没用的,并且根本循环。 -
@Bakuriu 是的,这就是我的想法。可能根本不做循环。我不知道怎么做,但昨天当我尝试不同的编码方式时,我得到了一些荒谬的性能,比如快了 12 000 倍。
-
这太过分了。这意味着编译器将整个循环替换为单个无操作。如果所用时间不随输入大小而变化,您应该会看到这一点。
-
您可能在这些系统上有不同的编译器。在我的装有 gcc4.7.2 的 Corei5 笔记本电脑上,mymodule.loop(N) 总是需要大约 120 纳秒,无论 N 有多大,即它会跳过循环。
标签: python performance return cython