Python: Iteration über Liste vs über dict Elemente Effizienz

Ist some_dict.items() über some_dict.items() so effizient wie Iteration über eine Liste der gleichen Elemente in CPython?

3 Solutions collect form web for “Python: Iteration über Liste vs über dict Elemente Effizienz”

Es hängt davon ab, welche Version von Python Sie verwenden. In Python 2 erstellt some_dict.items() eine neue Liste, die einige zusätzliche Zeit in some_dict.items() nimmt und zusätzlichen Speicher verwendet. Auf der anderen Seite, sobald die Liste erstellt ist, ist es eine Liste, und so sollte identische Leistungsmerkmale haben, nachdem der Overhead der Listenerstellung abgeschlossen ist.

In Python 3 erstellt some_dict.items() ein View-Objekt anstelle einer Liste und ich some_dict.items() , dass das Erstellen und Iterieren über items() schneller als in Python 2 wäre, da nichts kopiert werden muss. Aber ich erwarte auch , dass die Iteration über eine bereits erstellte Ansicht etwas langsamer als die Iteration über eine bereits erstellte Liste wäre, weil Wörterbuchdaten etwas spärlich gespeichert sind, und ich glaube, es gibt keinen guten Weg für Python, um zu vermeiden, dass sie über jeden Bin in Das Wörterbuch – auch die leeren.

In Python 2 bestätigen einige Timings meine Intuitionen:

 >>> some_dict = dict(zip(xrange(1000), reversed(xrange(1000)))) >>> some_list = zip(xrange(1000), xrange(1000)) >>> %timeit for t in some_list: t 10000 loops, best of 3: 25.6 us per loop >>> %timeit for t in some_dict.items(): t 10000 loops, best of 3: 57.3 us per loop 

Iterating über die items ist etwa doppelt so langsam. Mit iteritems ist ein bisschen schneller …

 >>> %timeit for t in some_dict.iteritems(): t 10000 loops, best of 3: 41.3 us per loop 

Aber Iteration über die Liste selbst ist im Grunde das gleiche wie Iteration über jede andere Liste:

 >>> some_dict_list = some_dict.items() >>> %timeit for t in some_dict_list: t 10000 loops, best of 3: 26.1 us per loop 

Python 3 kann erstellen und iterieren über items schneller als Python 2 kann (vergleiche 57,3 uns oben):

 >>> some_dict = dict(zip(range(1000), reversed(range(1000)))) >>> %timeit for t in some_dict.items(): t 10000 loops, best of 3: 33.4 us per loop 

Aber die Zeit, um eine Ansicht zu schaffen, ist vernachlässigbar; Es ist tatsächlich langsamer, um zu übertreiben als eine Liste.

 >>> some_list = list(zip(range(1000), reversed(range(1000)))) >>> some_dict_view = some_dict.items() >>> %timeit for t in some_list: t 10000 loops, best of 3: 18.6 us per loop >>> %timeit for t in some_dict_view: t 10000 loops, best of 3: 33.3 us per loop 

Dies bedeutet, dass in Python 3, wenn Sie wollen, um viele Male über die Elemente in einem Wörterbuch zu iterieren, und die Leistung ist kritisch, können Sie eine 30% Beschleunigung durch Zwischenspeichern der Ansicht als Liste.

 >>> some_list = list(some_dict_view) >>> %timeit for t in some_list: t 100000 loops, best of 3: 18.6 us per loop 

Ein kleiner Maßstab zeigt mir, dass das Erlöschen einer Liste definitiv schneller ist.

 def iterlist(list_): i = 0 for _ in list_: i += 1 return i def iterdict(dict_): i = 0 for _ in dict_.iteritems(): i += 1 return i def noiterdict(dict_): i = 0 for _ in dict_.items(): i += 1 return i list_ = range(1000000) dict_ = dict(zip(range(1000000), range(1000000))) 

Getestet mit IPython auf Python 2.7 (Kubuntu):

 %timeit iterlist(list_) 10 loops, best of 3: 28.5 ms per loop %timeit iterdict(dict_) 10 loops, best of 3: 39.7 ms per loop %timeit noiterdict(dict_) 10 loops, best of 3: 86.1 ms per loop 

Obwohl some_list durch some_list ist 2x speedup als some_dict.items() , aber some_list durch some_list nach Index ist fast so selben wie some_dict durch some_dict by key.

 K = 1000000 some_dict = dict(zip(xrange(K), reversed(xrange(K)))) some_list = zip(xrange(K), xrange(K)) %timeit for t in some_list: t 10 loops, best of 3: 55.7 ms per loop %timeit for i in xrange(len(some_list)):some_list[i] 10 loops, best of 3: 94 ms per loop %timeit for key in some_dict: some_dict[key] 10 loops, best of 3: 115 ms per loop %timeit for i,t in enumerate(some_list): t 10 loops, best of 3: 103 ms per loop 
  • Verbinden Sie mit Pythons sqlite Modul ist langsamer als es manuell zu tun
  • Ist 2-dimensional numpy.take schnell?
  • Wie man diesen Block von Python-Code kurz und effizient macht
  • Pythonische Art, ein numpy Array aus einer Liste von numpy Arrays zu erstellen
  • Wie effizient ist die Maximale Funktion von Python
  • Ein schneller verschachteltes Tupel zur Liste und zurück
  • Welches ist der effizienteste Weg, um durch eine Liste in Python zu iterieren?
  • Vektorisierte radix sort mit numpy - kann es schlagen np.sort?
  • Warum ist str.strip () so viel schneller als str.strip ('')?
  • Warum ist Looping über Bereich () in Python schneller als mit einer while-Schleife?
  • Leistung der Erstellung neuer DataFrame
  • Python ist die beste Programmiersprache der Welt.