擅长:python、mysql、java
<p>实际上,假设start、stop和step是C变量,就可以将一个范围内的<em>任何</em><code>for</code>循环转换为完全优化的C循环。你只要写得再巧妙一点就行了。在</p>
<p>以<code>loop1()</code>开头:</p>
<pre><code>def loop1(int start, int stop, int step):
cdef int x, t = 0
for x in range(start, stop, step):
t += x
return t
</code></pre>
<p>Cython(目前)不知道如何优化它,因为它不知道<code>step</code>的符号。事实证明,这个问题最简单的解决方案就是解决一个稍微更一般的问题。也就是说:</p>
^{pr2}$
<p><code>count</code>变量看起来没用,但问题的另一个版本可能会在循环体中使用它。在</p>
<p>现在,用手计算指数:</p>
<pre><code>def loop1(int start, int stop, int step):
cdef:
int x
int count
int length
int t = 0
length = len(range(start, stop, step)) # could optimize this further
for count in range(length):
x = start + count*step
t += x
return t
</code></pre>
<p>我已经尝试过了,我知道它生成纯C代码(除了<code>length =</code>行)。事实上,我已经成功地在<code>nogil</code>块中使用了它。<code>cython -a</code>显示循环本身的所有白色输出。在</p>
<p>这将创建两个额外的变量,以及一些死存储等,但是我假设任何一个半途而废的编译器都应该能够消除<code>-O2</code>上的那些变量。因此,它适用于高性能环路。在</p>