私はtimeitで非常に驚くべき結果を得ました。私はPython 2.7を使用しています。Python timeitで驚くべき結果が得られました:Counter()vs defaultdict()vs dict()
これは、ファイルspeedtest_init.pyの内容は次のとおりです。
import random
to_count = [random.randint(0, 100) for r in range(60)]
これらはspeedtest.pyの内容は以下のとおりです。
__author__ = 'BlueTrin'
import timeit
def test_init1():
print(timeit.timeit('import speedtest_init'))
def test_counter1():
s = """\
d = defaultdict(int);
for i in speedtest_init.to_count:
d[i] += 1
"""
print(timeit.timeit(s, 'from collections import defaultdict; import speedtest_init;'))
def test_counter2():
print(timeit.timeit('d = Counter(speedtest_init.to_count);', 'from collections import Counter; import speedtest_init;'))
if __name__ == "__main__":
test_init1()
test_counter1()
test_counter2()
コンソール出力は次のとおりです。
C:\Python27\python.exe C:/Dev/codility/chlorum2014/speedtest.py
2.71501962931
65.7090444503
91.2953839048
Process finished with exit code 0
私はデフォルトでtimeit()は1000000回コードを実行すると思うので、1000000で時間を分割する必要がありますが、驚くべきことですCounterがdefaultdict()よりも遅いということです。
これは期待ですか?
EDIT:
また、辞書を使用してdefaultdict(int型)よりも高速です:
def test_counter3():
s = """\
d = {};
for i in speedtest_init.to_count:
if i not in d:
d[i] = 1
else:
d[i] += 1
"""
print(timeit.timeit(stmt=s, setup='from collections import defaultdict; import speedtest_init;')
この最後のバージョンはdefaultdict(INT)あなたは読みやすさについてもっと気にしない限り、という意味よりも高速ですdefaultdict()ではなくdict()を使うべきです。
を(defaultdictよりも高速です)、質問 – BlueTrin
を更新しますこれは本当に驚くべきことです。あなたは目的構築のクラスが最速の実装であると期待しています。それが速ければ、なぜ 'Counter'は実装に' defaultdict'を使用しませんか? –
@ MarkRansom: 'Counter'は' defaultdict'よりもはるかに機能します。しかし、より高速な 'defaultdict'サブクラスとして' Counter'を作成できれば、おそらくあなたはパッチを提案することができます。 :-) –