私は大きな単語リストを管理し、リストの各単語を検証するかどうかを判断するために多くのテストをパスするプロジェクトに取り組んできました。面白いのは、私がitertools
モジュールのような「高速な」ツールを使用するたびに、それらは遅くなるようです。"any()"がループを使用するよりも遅く動作するのはなぜですか?
最後に、私が何か間違っている可能性があるため、質問をすることにしました。次のコードは、ループの使用に対して関数any()
のパフォーマンスをテストしようとします。
#!/usr/bin/python3
#
import time
from unicodedata import normalize
file_path='./tests'
start=time.time()
with open(file_path, encoding='utf-8', mode='rt') as f:
tests_list=f.read()
print('File reading done in {} seconds'.format(time.time() - start))
start=time.time()
tests_list=[line.strip() for line in normalize('NFC',tests_list).splitlines()]
print('String formalization, and list strip done in {} seconds'.format(time.time()-start))
print('{} strings'.format(len(tests_list)))
unallowed_combinations=['ab','ac','ad','ae','af','ag','ah','ai','af','ax',
'ae','rt','rz','bt','du','iz','ip','uy','io','ik',
'il','iw','ww','wp']
def combination_is_valid(string):
if any(combination in string for combination in unallowed_combinations):
return False
return True
def combination_is_valid2(string):
for combination in unallowed_combinations:
if combination in string:
return False
return True
print('Testing the performance of any()')
start=time.time()
for string in tests_list:
combination_is_valid(string)
print('combination_is_valid ended in {} seconds'.format(time.time()-start))
start=time.time()
for string in tests_list:
combination_is_valid2(string)
print('combination_is_valid2 ended in {} seconds'.format(time.time()-start))
以前のコードでは、私が行うテストの種類のかなりの代表であり、我々は結果を見て取る場合:
File reading done in 0.22988605499267578 seconds
String formalization, and list strip done in 6.803032875061035 seconds
38709922 strings
Testing the performance of any()
combination_is_valid ended in 80.74802565574646 seconds
combination_is_valid2 ended in 41.69514226913452 seconds
File reading done in 0.24268722534179688 seconds
String formalization, and list strip done in 6.720442771911621 seconds
38709922 strings
Testing the performance of any()
combination_is_valid ended in 79.05265760421753 seconds
combination_is_valid2 ended in 42.24800777435303 seconds
を私はループを使用すると、使用するよりも半分高速であることをちょっと驚くべき発見しますany()
。それについての説明は何でしょうか?私は何か間違っているのですか?
は
あなたのテストベクトルに 'True'を返す文字列が含まれていますか? –
@ IgnacioVazquez-Abramsはい、真と偽の両方がありますが、私はパーセントをチェックしませんでした。それは非常に興味深いことに、私はそれをスタッフィングすることを考えなかった! – rsm
これはおそらく、ジェネレータの式がループ上で間接的なレベルを提供するため、事態が遅くなるからです。 – interjay