Çok şaşırtıcı sonuçlar elde ettim timeit ile, birisi yanlış bir şey yapsam bana söyleyebilir mi? Python 2.7 kullanıyorum. speedtest.py aitPython zaman çizelgesi ile şaşırtıcı sonuçlar: Counter() vs defaultdict() vs dict()
import random
to_count = [random.randint(0, 100) for r in range(60)]
Bunlar, içeriği:
__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()
konsol çıktısı:
C:\Python27\python.exe C:/Dev/codility/chlorum2014/speedtest.py
2.71501962931
65.7090444503
91.2953839048
Process finished with exit code 0
ben
Bu
dosya speedtest_init.py içeriği olan varsayılan olarak düşünün timeit() 1000000 kez kod çalıştırır, bu yüzden zamanları 1000000'e bölmem gerekir, ama şaşırtıcı olan şey nedir? Sayaç, defaultdict() 'den daha yavaştır.Bu beklenen mi?
DÜZENLEME:
Ayrıca dict kullanarak bir defaultdict (int) daha hızlıdır:
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;')
bu son sürümü defaultdict (int) daha hızlıdır anlamı daha okunabilirlik umurumda sürece sen defaultdict() yerine dict() kullanmalısınız.
Başka bir test ve bir dicti (kullanarak yapmış) bir defaultdict(), soruya – BlueTrin
güncelleyecek Bu gerçekten şaşırtıcı daha hızlıdır; Amaca dayalı bir sınıfın en hızlı uygulama olmasını beklersiniz. Neden daha hızlı olursa, 'Counter' uygulama için 'defaultdict' kullanmıyor? –
@MarkRansom: 'Counter',' defaultdict' işlevinden çok daha fazlasını yapar. Ancak, daha hızlı olan 'defaultdict' alt sınıfı olarak bir' Counter' oluşturabilirsek, belki de bir yama önerebilirsiniz. :-) –