<p>在CPython中,追加python列表是一个很好的优化操作。Python不为每个元素分配内存,而是递增地增加指向列表中对象的指针数组。所以换成Cython对你没什么帮助。</p>
<p>您可以在Cython中使用c++容器,如下所示:</p>
<pre><code>from libc.math cimport log
from libcpp.list cimport list as cpplist
def main(int t):
cdef cpplist[int] temp
for x in range(t):
if x> 0:
temp.push_back(x)
cdef int N = temp.size()
cdef list OutputList = N*[0]
for i in range(N):
OutputList[i] = temp.front()
temp.pop_front()
return OutputList
</code></pre>
<p>你必须测试一下这是否会加快速度,但也许你不会获得太多的速度。</p>
<p>另一种方法是使用numpy数组。在这里,Cython非常擅长优化代码。因此,如果您可以使用numpy数组作为main的返回值,那么您应该考虑这样做,并用一些Cython代码分配和填充numpy数组来替换<code>OutputList</code>的构造和填充。</p>
<p>有关详细信息,请参见<a href="http://docs.cython.org/src/tutorial/numpy.html" rel="nofollow">http://docs.cython.org/src/tutorial/numpy.html</a></p>
<p>问问你是否需要帮助。</p>
<p><strong>更新</strong>:如果避免在两个循环中查找方法,则代码应该快一点:</p>
<pre><code>from libc.math cimport log
from libcpp.list cimport list as cpplist
def main(int t):
cdef cpplist[int] temp
push_back = temp.push_back
for x in range(t):
if x> 0:
push_back(x)
cdef int N = temp.size()
cdef list OutputList = N*[0]
front = temp.front()
pop_front = temp.pop_front()
for i in range(N):
OutputList[i] = front()
pop_front()
return OutputList
</code></pre>