Was ist schneller, Notation in der Liste, für und während? Ich habe mich gefragt, also habe ich verschiedene Codes geschrieben und gemessen.
python2.7 windows7 Intel Core i5 CPU 2.4GHz Speicher 4,0 GB
für Einzelschleife (1 Million Mal) für Doppelschleife (1000 mal x 1000 mal) Notation der Listeneinbeziehung (1 Million Mal) Listeneinschlussnotation (1000 mal x 1000 mal) während einzelne Schleife (1 Million Mal) während Doppelschleife (1000 mal x 1000 mal)
Beim Erstellen einer Liste Bei + für (mit oder ohne Reichweite)
Wenn Sie nur eine Liste erstellen möchten, war die Listeneinschlussnotation die schnellste. Als die if-Anweisung aufgenommen wurde, wurde sie insgesamt etwas schlechter, und die Notation für und für die Aufnahme von Listen änderte sich nicht wesentlich. während war eine Doppelschleife und offensichtlich verlangsamt. Ich bin mir nicht sicher warum. Bei der Berechnung des Gesamtwerts ist die Listeneinschlussnotation langsamer als für. Dies scheint zu bedeuten, dass es Zeit braucht, um eine Million Stück zu summieren. Das Ergebnis der Gesamtwertberechnung + if ist das gleiche, unabhängig davon, ob es in der Liste enthalten ist oder für.
Sie können die Listeneinschlussnotation vorerst schreiben, aber wenn der Prozess die erstellte Liste nicht verwendet (z. B. einfach Summe nehmen), erhöhen sich die Kosten für die Verarbeitung der Liste mit anderen Funktionen (Summe () usw.). Und kann langsam sein. Während sollte vorsichtig sein, wenn von mehreren Schleifen.
seq1 = range(10**6)
seq2 = range(10**3)
num1 = 10**6
num2 = 10**3
v = 10**10
def for1():
ls = []
for i in seq1:
ls.append(v)
#print len(ls)
def for2():
ls = []
for i in seq2:
for j in seq2:
ls.append(v)
#print len(ls)
def for_range1():
ls = []
for i in range(10**6):
ls.append(v)
#print len(ls)
def for_range2():
ls = []
for i in range(10**3):
for j in range(10**3):
ls.append(v)
#print len(ls)
def for_listnai1():
[v for i in seq1]
def for_listnai2():
[v for i in seq2 for j in seq2]
def for_listnai_range1():
[v for i in range(10**6)]
def for_listnai_range2():
[v for i in range(10**3) for j in range(10**3)]
def forsum1():
s = 0
for i in seq1:
s += v
def forsum2():
s = 0
for i in seq2:
for j in seq2:
s += v
def for_listnaisum1():
sum([v for i in seq1])
def for_listnaisum2():
sum([v for i in seq2 for j in seq2])
def while1():
i = 0
ls = []
while i < num1:
ls.append(v)
i+=1
def while2():
i = 0
ls = []
while i < num2:
j = 0
while j < num2:
ls.append(v)
j+=1
i+=1
def whilesum1():
i = 0
s = 0
while i < num1:
s += v
i+=1
def whilesum2():
i = 0
s = 0
while i < num2:
j = 0
while j < num2:
s += v
j+=1
i+=1
def forif1():
ls = []
for i in seq1:
if v % 2:
ls.append(v)
def forif2():
ls = []
for i in seq2:
for j in seq2:
if v % 2:
ls.append(v)
def forlistnaiif1():
[v for i in seq1 if v % 2]
def forlistnaiif2():
[v for i in seq2 for j in seq2 if v % 2]
def whileif1():
ls = []
i=0
while i <num1:
ls.append(v)
i+=1
def whileif2():
ls = []
i=0
while i <num2:
j=0
while j<num2 :
if v % 2:
ls.append(v)
j+=1
i+=1
def forifsum1():
s = 0
for i in seq1:
if v % 2:
s+=v
def forifsum2():
s = 0
for i in seq2:
for j in seq2:
if v % 2:
s+=v
def forlistnaiifsum1():
sum([v for i in seq1 if v % 2])
def forlistnaiifsum2():
sum([v for i in seq2 for j in seq2 if v % 2])
def whileifsum1():
s = 0
i=0
while i <num1:
s+=v
i+=1
def whileifsum2():
s=0
i=0
while i <num2:
j=0
while j<num2 :
if v % 2:
s+=v
j+=1
i+=1
def exe(func,num=0):
import time
print "%s start:" % func
s = 0
for i in range(0,num):
start = time.time()
exec func
end = time.time()
s += end - start
print "%s finished: %d times." % (func,num)
print s
if __name__=='__main__':
exe("for1()",1)
exe("for2()",1)
exe("for_range1()",1)
exe("for_range2()",1)
exe("for_listnai1()",1)
exe("for_listnai2()",1)
exe("for_listnai_range1()",1)
exe("for_listnai_range2()",1)
exe("while1()",1)
exe("while2()",1)
exe("forsum1()",1)
exe("forsum2()",1)
exe("for_listnaisum1()",1)
exe("for_listnaisum2()",1)
exe("whilesum1()",1)
exe("whilesum2()",1)
exe("forif1()",1)
exe("forif2()",1)
exe("forlistnaiif1()",1)
exe("forlistnaiif2()",1)
exe("whileif1()",1)
exe("whileif2()",1)
exe("forifsum1()",1)
exe("forifsum2()",1)
exe("forlistnaiifsum1()",1)
exe("forlistnaiifsum2()",1)
exe("whileifsum1()",1)
exe("whileifsum2()",1)