Vin*_*ent 5 python optimization loops cython
引用Cython文档:
Cython recognises the usual Python for-in-range integer loop pattern:
for i in range(n):
...
If i is declared as a cdef integer type, it will optimise this into a pure C loop
Run Code Online (Sandbox Code Playgroud)
我写了两个版本的简单Cython函数,一个使用Python range
,另一个使用for-from
Pyrex表示法(应该弃用):
def loop1(int start, int stop, int step):
cdef int x, t = 0
for x in range(start, stop, step):
t += x
return t
def loop2(int start, int stop, int step):
cdef int x, t = 0
for x from start <= x < stop by step:
t += x
return t
Run Code Online (Sandbox Code Playgroud)
通过查看.c
文件,我注意到两个循环已经以一种非常不同的方式处理:
第一个实际上是使用Python对象创建Python范围.它带有50行不必要的Python-to-C C-to-Python内容.
第二个已经优化成一个漂亮的纯C循环:
__pyx_t_1 = __pyx_v_stop;
__pyx_t_2 = __pyx_v_step;
for (__pyx_v_x = __pyx_v_start; __pyx_v_x < __pyx_t_1; __pyx_v_x+=__pyx_t_2) {
Run Code Online (Sandbox Code Playgroud)
我错过了什么,还是我应该报告的错误?
文档确实提到了这个:
自动量程转换
当i是任何cdef'd整数类型时,这将把范围(...)中i的形式的语句转换为i,并且可以确定方向(即步骤的符号).
我想Cython想要在编译时知道步骤的符号,以便生成<
或>
在C循环的结束条件中.