解決策を提案し、自分の投稿を追加しますh、赤面が赤くなり、残りの部分を軽く叩く。このテストスクリプトは、最も遅くなるように整理されています。私は50%一致するリストを使用します。オリジナルのケースとイールドケースでは、一致率が高いほどパフォーマンスが悪くなります。私のジャンキーのラップトップ上
from timeit import timeit
# generate test with half matching
myList = ['&abc', 'def'] * 10000
def orig():
newList = []
for v in myList:
if v.startswith('&'):
newList.append(v)
print('orig')
print(timeit("orig()", setup="from __main__ import orig", number=5000))
def doyield():
def inner(myList):
for v in myList:
if v.startswith('&'):
yield v
newList = list(inner(myList))
print('yield')
print(timeit("doyield()", setup="from __main__ import doyield", number=5000))
def comp1():
newList = [v for v in myList if v.startswith('&')]
print('comprehension with startswith')
print(timeit("comp1()", setup="from __main__ import comp1", number=5000))
def comp2():
newList = [v for v in myList if v and v[0]=='&']
print('comprehension with compare')
print(timeit("comp2()", setup="from __main__ import comp2", number=5000))
:
orig
55.8570241928
yield
50.6004090309
comprehension with startswith
47.4232199192
comprehension with compare
24.5065619946
UPDATE
問題でcythonコンパイラを投げると何が起こるか見てみましょう。注:cythonをインストールする必要があります。パッケージ化されているシステムでは簡単です。それ以外の場合は、チェックアウトhttp://cython.orgです。私はテストを別のモジュールに分割し、新しいテストモジュールにインポート時にコンパイルするようにしました。 cythonモジュールをコンパイルする他の方法があります(cython Webサイトのsetup.py情報を参照してください)。しかし、この方法はこのテストには簡単です。欠点は、最初の実行時にコードがコンパイルされることです(しばらく待つ必要があります)、エラーが発生する可能性があります。
興味深いことに、元のコードははるかに優れていますが、4番目のコードはこれまでのところ最速です。
test.py
from timeit import timeit
# generate test with half matching
myList = ['&abc', 'def'] * 10000
def orig():
newList = []
for v in myList:
if v.startswith('&'):
newList.append(v)
def doyield():
def inner(myList):
for v in myList:
if v.startswith('&'):
yield v
newList = list(inner(myList))
def comp1():
newList = [v for v in myList if v.startswith('&')]
def comp2():
newList = [v for v in myList if v and v[0]=='&']
cytest。それを実行しているPY
import pyximport
pyximport.install(pyimport = True)
from test2 import *
from timeit import timeit
print('orig')
print(timeit("orig()", setup="from __main__ import orig", number=5000))
print('yield')
print(timeit("doyield()", setup="from __main__ import doyield", number=5000))
print('comprehension with startswith')
print(timeit("comp1()", setup="from __main__ import comp1", number=5000))
print('comprehension with compare')
print(timeit("comp2()", setup="from __main__ import comp2", number=5000))
私はまた、制約を提供してください、これが遅いどの
orig
29.2698290348
yield
31.7977068424
comprehension with startswith
29.41690588
comprehension with compare
4.69118189812
を取得します。 – bhansa
len(myList)== 10 ** 9 .. –
ここでは、yieldとappendの使用の利点を見ることができます。http://stackoverflow.com/questions/3487802/which-is-generally-faster-a-yield- or-an-append –