Cython:纯C循环优化

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-fromPyrex表示法(应该弃用):

 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)

我错过了什么,还是我应该报告的错误?

Jan*_*ila 5

文档确实提到了这个:

自动量程转换

当i是任何cdef'd整数类型时,这将把范围(...)中i的形式的语句转换为i,并且可以确定方向(即步骤的符号).

我想Cython想要在编译时知道步骤的符号,以便生成<>在C循环的结束条件中.

另请参阅Cython Trac上的#546票