<p>可以使用<a href="http://pythran.readthedocs.io" rel="nofollow noreferrer" title="pythran">Pythran</a>自动将代码转换为本机高效版本(显式迭代NumPy数组元素是一个性能瓶颈)。你知道吗</p>
<p>比如:</p>
<pre><code>#pythran export pattern(bool [])
import numpy as np
def pattern(arr):
patternFound = False
threshold = 3
nonzerosCount = 0
zerosCount = 0
split_indexes=[]
for i in range(len(arr)):
if patternFound:
if arr[i] <= 0:
zerosCount += 1
else:
zerosCount = 0
if zerosCount >= threshold and i+1 != len(arr):
zerosCount = 0
patternFound=False
split_indexes.append(i+1)
else:
if arr[i] >= 1:
nonzerosCount += 1
else:
nonzerosCount = 0
if nonzerosCount >= threshold:
nonzerosCount = 0
patternFound = True
split_indexes = np.asarray(split_indexes)
return split_indexes, np.split(arr, split_indexes)
</code></pre>
<p>用<code>pythran pattern.py</code>编译。
很好用。你知道吗</p>
<p>没有Pythran:</p>
<pre><code>% python -m timeit -s 'import pattern, numpy; arr = numpy.asarray(numpy.random.choice([0, 1], size=1000000), dtype=bool)' 'pattern.pattern(arr)'
10 loops, best of 3: 3.11 sec per loop
</code></pre>
<p>与Pytran:</p>
<pre><code>% python -m timeit -s 'import pattern, numpy; arr = numpy.asarray(numpy.random.choice([0, 1], size=100000), dtype=bool)' 'pattern.pattern(arr)'
1000 loops, best of 3: 880 usec per loop
</code></pre>