2017-12-30 38 views
0

Code:Verwirrt über die Ausführung von zwei Codes in Python? 1

%%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
second_highest = sorted(list(set([x[1] for x in students])))[1] 
([a for a,b in sorted(students) if b == second_highest]) 

Code 2:

%%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
s = sorted(set([x[1] for x in students])) 
for name in sorted(x[0] for x in students if x[1] == s[1]): 
    name 

enter image description here

Jetzt ich bin verwirrt über die Ausführung von zwei Programmen, wie code2 ist schneller als code1, trotz Verwendung von verschachtelten für Schleife in Code2. Bild unten ist von Jupyter Notizbuch, das mittlere Zeit zeigt, die durch Code von 100000 Schleifen genommen wird. Obwohl der Unterschied sehr klein ist, bin ich verwirrt, denn wie kann verschachtelte For-Schleife schneller arbeiten als Single For-Schleife.

Ich sollte die Ausgabe drucken, kann den Druck so setze vor der letzten Zeile des Codes

+0

Was soll die letzte Zeile in jeder Schleife tun? Es macht wirklich nichts. Der Unterschied liegt in dem zusätzlichen Aufruf der Funktion "Liste" in der zweiten Zeile. –

+0

Ich sollte die Ausgabe drucken, so kann Print vor der letzten Zeile des Codes setzen – Priyansh

Antwort

0

Es ist nicht eine verschachtelte Schleife.

Es scheint, Sie irren sich über diese Linie

for name in sorted(x[0] for x in students if x[1] == s[1]): 
    name 

Hier werden Sie einen Generator zu schaffen und an die sorted Funktion

sorted(x[0] for x in students if x[1] == s[1]) 

vorbei, die zuerst eine Liste berechnet. Nach dem Auswerten dieses Ausdrucks und dem Abrufen der Liste wird dieser durch die Schleife for wiederholt. Es sind also zwei Schleifen, die nicht verschachtelt sind.

+0

Danke, Andy, aber immer noch mit größerer Eingabegröße Zeit genommen von Code1 Anstieg exponentiell und auf der gleichen Hand Code2 steigt linear. Können Sie mir einen Grund nennen, warum Code2 schneller und besser ist als Code1? – Priyansh

0

Dies liegt daran, dass der Generator für den zweiten Fall an sorted() in der for Schleife übergeben wird. Die sorted()-Funktion erstellt zuerst eine Kopie der Sequenz, und diese Kopie wird langsamer für den Generator zur Liste als für die Liste zur Liste, da eine Liste zuerst vom Generator erstellt werden muss. Siehe this Frage. Wenn Sie also den Generator durch eine Liste ersetzen, wird es viel schneller.

In [11]: %%timeit 
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
s = sorted(set([x[1] for x in students])) 
for name in sorted([x[0] for x in students if x[1] == s[1]]): 
    name 
    ....: 
The slowest run took 5.71 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 4.72 µs per loop 

In [6]: %%timeit       
students = [['Zack',38],['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]] 
second_highest = sorted(list(set([x[1] for x in students])))[1] 
([a for a,b in sorted(students) if b == second_highest]) 
    ...: 
The slowest run took 11.50 times longer than the fastest. This could mean that an intermediate result is being cached. 
100000 loops, best of 3: 5.31 µs per loop