Otrzymałem bardzo zaskakujące wyniki z timeit, czy ktoś może mi powiedzieć, czy robię coś nie tak? Używam Pythona 2.7.Zaskakujące wyniki dzięki Pythonowi timeit: Counter() vs defaultdict() vs dict()
To jest zawartość pliku speedtest_init.py:
import random
to_count = [random.randint(0, 100) for r in range(60)]
Są zawartość 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()
Wyjście konsoli:
C:\Python27\python.exe C:/Dev/codility/chlorum2014/speedtest.py
2.71501962931
65.7090444503
91.2953839048
Process finished with exit code 0
I domyślnie timeit() uruchamia 1000000 razy kod, więc muszę podzielić czasy na 1000000, ale co jest zaskakujące jest to, że licznik jest wolniejszy niż defaultdict().
Czy to jest oczekiwane?
EDIT:
także przy użyciu dict jest szybszy niż 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;')
ta ostatnia wersja jest szybsza niż defaultdict (int), co oznacza, że jeśli nie bardziej dbać o czytelność ty powinien użyć funkcji dict() zamiast defaultdict().
zrobiłem kolejny test i przy użyciu dict() jest szybsza niż defaultdict(), zaktualizuje pytanie – BlueTrin
To naprawdę zaskakujące; można oczekiwać, że klasa celowa będzie najszybszą implementacją. Dlaczego 'Counter' nie używa' defaultdict' do swojej implementacji, jeśli jest szybszy? –
@MarkRansom: 'Counter' robi znacznie więcej niż' defaultdict'. Ale jeśli możemy utworzyć 'Counter' jako podklasę' defaultdict', która jest szybsza, być może możesz zaproponować łatkę. :-) –