Überraschende Ergebnisse mit Python timeit: Counter () vs defaultdict () vs dict ()

Ich habe mit timeit sehr überraschende Ergebnisse erzielt. Kann mir jemand sagen, ob ich etwas falsch mache? Ich verwende Python 2.7.

Dies ist der Inhalt der Datei speedtest_init.py

import random

to_count = [random.randint(0, 100) for r in range(60)]

Dies sind die Inhalte von 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()

Die Konsolenausgabe lautet:

C:\Python27\python.exe C:/Dev/codility/chlorum2014/speedtest.py
2.71501962931
65.7090444503
91.2953839048

Process finished with exit code 0

Ich denke, dass timeit () standardmäßig 1000000-mal den Code ausführt, daher muss ich die Zeiten durch 1000000 dividieren, aber was überrascht, ist, dass der Counter langsamer ist als das defaultdict ().

Ist das zu erwarten?

BEARBEITEN

Auch die Verwendung eines Diktats ist schneller als ein Standarddiktat (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;')

Diese letzte Version ist schneller als das defaultdict (int), was bedeutet, dass Sie das dict () anstelle des defaultdict () verwenden sollten, es sei denn, Sie legen mehr Wert auf Lesbarkeit.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage