append
aggiunge ogni articolo uno alla volta, che è la causa della sua lentezza, nonché la funzione ripetute chiamate a append
.
Tuttavia in questo caso l'operatore è +=
non zucchero sintattico per la +
. L'operatore +=
non crea effettivamente un nuovo elenco, quindi lo assegna indietro, modifica l'operando sinistro in posizione. È piuttosto evidente quando si utilizza timeit
per utilizzare entrambe le 10.000 volte.
>>> timeit.timeit(stmt="l = l + j", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.5794978141784668
>>> timeit.timeit(stmt="l += j", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.0013298988342285156
+=
è molto più veloce (circa 500x)
Hai anche il metodo extend
per gli elenchi che può aggiungere qualsiasi iterabile (non solo un altro elenco) con qualcosa di simile l.extend(l2)
>>> timeit.timeit(stmt="l.extend(j)", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.0016009807586669922
>>> timeit.timeit(stmt="for e in j: l.append(e)", setup="l=[1,2,3,4]; j = [5,6,7,8]", number=10000)
0.00805807113647461
Logicamente equivalente ad accodare, ma molto più velocemente come puoi vedere.
Quindi, per spiegare questo: iterazione è più veloce di +
perché +
deve costruire un intero nuovo elenco
extend
è più veloce di iterazione perché è un metodo di lista integrato ed è stato ottimizzato. Logicamente equivalente ad appendere ripetutamente, ma implementato in modo diverso.
+=
è più veloce di extend
perché può modificare l'elenco sul posto, sapendo quanto più grande deve essere l'elenco e senza chiamate di funzione ripetute.Si presuppone che si acceda alla lista con un'altra lista/tupla
Non sono affatto la stessa cosa. –
Quando si fanno domande sulla tempistica, è una buona idea mostrare una versione riproducibile di come l'hai cronometrata: che entrambi mostrano i dettagli del tuo confronto e danno agli altri un vantaggio nel dare un'occhiata. –
e per quanto riguarda 'list1.extend (list2)'? – imkost