<h3><a href="https://gist.github.com/1235546#file_build1darray.pyx" rel="nofollow">build1darray.pyx</a>:</h3>
<ul>
<li>指定<a href="http://docs.cython.org/src/tutorial/numpy.html#efficient-indexing" rel="nofollow">types for index variables</a></li>
<li>关闭<a href="http://docs.cython.org/src/tutorial/numpy.html#tuning-indexing-further" rel="nofollow">safety checks</a></li>
<li>可以<a href="http://docs.cython.org/src/userguide/parallelism.html?highlight=openmp" rel="nofollow">uses multiple cpus</a>(对于大型<code>t</code>和<code>v.size()</code>非常有用)</li>
</ul>
<p/>
<pre><code>#cython: boundscheck=False, wraparound=False
from libc.math cimport log
from cython.parallel cimport prange
import numpy as pynp
cimport numpy as np
# copy declarations from libcpp.vector to allow nogil
cdef extern from "<vector>" namespace "std":
cdef cppclass vector[T]:
void push_back(T&) nogil
size_t size()
T& operator[](size_t)
def makearray(int t):
cdef vector[np.float_t] v
cdef int i
with nogil:
for i in range(t):
if i % 10 == 0:
v.push_back(log(i+1))
cdef np.ndarray[np.float_t] a = pynp.empty(v.size(), dtype=pynp.float)
for i in prange(a.shape[0], nogil=True):
a[i] = v[i]
return a
</code></pre>
<p>第二部分是第一个循环的~1%,因此在这种情况下,对其速度进行优化是没有意义的。</p>
<p><code><math.h></code>在我的系统上有<code>extern "C" { ... }</code>所以<code>libc.math.log</code>工作。</p>
<p>可以使用<code>PyArray_SimpleNewFromData()</code>来避免复制数据,从而为数组管理内存。</p>