Quel est le plus rapide, la notation dans la liste, pour et pendant? Je me demandais, alors j'ai écrit divers codes et les ai mesurés.
python2.7 windows7 Intel Core i5 CPU 2.4GHz Mémoire 4,0 Go
pour boucle simple (1 million de fois) pour double boucle (1000 fois x 1000 fois) Notation d'inclusion de liste (1 million de fois) Notation d'inclusion de liste (1000 fois x 1000 fois) en boucle unique (1 million de fois) en double boucle (1000 fois x 1000 fois)
Lors de la création d'une liste En cas de + pour (avec ou sans plage)
Si vous souhaitez simplement créer une liste, la notation d'inclusion de liste était la plus rapide. Lorsque l'instruction if était incluse, la situation était un peu pire dans l'ensemble, et la notation d'inclusion for et list n'a pas beaucoup changé. alors que c'était une double boucle et évidemment ralenti. Je ne sais pas pourquoi. Lorsqu'il s'agit de calculer la valeur totale, la notation d'inclusion de liste est plus lente que pour. Cela semble signifier qu'il faut du temps pour additionner un million de pièces. Le résultat du calcul de la valeur totale + if est le même, qu'il soit inclus dans la liste ou pour.
Pour le moment, vous pouvez écrire la notation d'inclusion de liste, mais si le processus n'utilise pas la liste créée (comme la simple prise de somme), le coût de traitement de la liste avec d'autres fonctions (sum () etc.) augmentera. Et peut être lent. Alors qu'il faut être prudent si de multiples boucles.
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)