it-swarm.com.de

Python Wörterbuch vs. Liste, welche ist schneller?

Ich programmierte ein Euler-Problem, und ich wurde in Frage gestellt, was meine Neugier weckte. Ich habe zwei Codefragmente. Die eine verwendet Listen, die anderen Wörterbücher. 

Listen verwenden :

n=100000
num=[]
suma=0
for i in range(n,1,-1):
    tmp=Tuple(set([n for n in factors(i)]))
    if len(tmp) != 2: continue
    if tmp not in num:
       num.append(tmp)
           suma+=i

Wörterbücher verwenden :

n=100000
num={}
suma=0
for i in range(n,1,-1):
   tmp=Tuple(set([n for n in factors(i)]))
   if len(tmp) != 2: continue
   if tmp not in num:
      num[tmp]=i
      suma+=i

Mir geht es nur um die Leistung. Warum läuft das zweite Beispiel mit Wörterbüchern unglaublich schnell, schneller als das erste Beispiel mit Listen. Das Beispiel mit Wörterbüchern läuft fast dreißigmal schneller!

Ich habe diesen 2 Code mit n = 1000000 getestet, und der erste Code lief in 1032 Sekunden und der zweite Code in nur 3,3 Sekunden.

8
froycard

In Python beträgt die durchschnittliche Zeitkomplexität einer Suche nach Wörterbuchschlüsseln O (1), da sie als Hashtabellen implementiert sind. Die zeitliche Komplexität der Suche in einer Liste beträgt durchschnittlich O(n). In Ihrem Code macht dies einen Unterschied in der Zeile if tmp not in num:, da Python im Listenfall die gesamte Liste durchsuchen muss, um die Mitgliedschaft zu ermitteln, während dies im Diktierfall nicht auf den absolut schlimmsten Fall beschränkt ist.

Weitere Informationen finden Sie unter TimeComplexity .

10
Karin

Wenn es um Geschwindigkeit geht, sollten Sie keine Listen erstellen:

n = 100000
factors = ((frozenset(factors(i)), i) for i in range(2, n+1))
num = {k:v for k,v in factors if len(k)==2}
suma = sum(num.values())
2
Daniel

In einer Liste lautet der Code if tmp not in num: O (n), während es O(lgn) im Dikt ist.

Edit : Das Diktat basiert auf Hashing, also ist es viel schneller als die Suche in der Linienliste . Danke an @ user2357112 für diesen Punkt.

0
citaret

Ich bin fast sicher, dass die "magische Sauce", die ein Wörterbuch verwendet, in der Tatsache liegt, dass das Wörterbuch aus Schlüssel-> Wertpaaren besteht.

in einer Liste beschäftigen Sie sich mit Arrays, dh die for-Schleife muss bei Index 0 in Ihrer Liste beginnen, um alle Datensätze durchlaufen zu können.

das Wörterbuch muss nur das betreffende Schlüssel-> Wertepaar bei der ersten "Runde" finden und zurückgeben, daher die Geschwindigkeit ...

im Grunde ist das Testen auf Mitgliedschaft in einer Gruppe von Schlüssel-> Wertepaaren viel schneller als das Durchsuchen einer ganzen Liste nach einem Wert. Je größer Ihre Liste wird, desto langsamer wird sie sein. Dies ist jedoch nicht immer der Fall. Es gibt Szenarien, in denen eine Liste schneller sein wird

0
lopezdp