"Entrambi sono mutabili" ti ingannano un po '.
È vero che nel metodo list-append, l'elenco è modificabile. Ma costruire la lista non è la parte lenta. Se hai 1000 stringhe di lunghezza media 1000, stai facendo 1000000 mutazioni all'array, ma solo 1000 mutazioni alla lista (più 1000 increfs agli oggetti stringa).
In particolare, ciò significa che lo array
dovrà impiegare 1000 volte tanto tempo in espansione (allocando nuovo spazio di archiviazione e copiando il tutto fino ad ora).
La parte lenta per il metodo elenco è la chiamata str.join
alla fine. Ma questo non è modificabile e non richiede alcuna espansione. Utilizza due passaggi, per calcolare prima le dimensioni necessarie, quindi copiare tutto in esso.
Inoltre, quel codice all'interno di str.join
ha avuto (e ha continuato ad avere da quando quell'articolo è stato scritto 9 anni fa) un sacco di lavoro per ottimizzarlo, perché è un linguaggio molto comune e consigliato, che molti programmi reali dipendono ogni giorno; array
è stato a malapena toccato da quando è stato aggiunto alla lingua.
Ma se vuoi davvero capire le differenze, devi guardare la fonte. In 2.7, il lavoro principale per il metodo array è array_fromstring
, mentre il lavoro principale per il metodo elenco è in string_join
. Puoi vedere come quest'ultimo sfrutta il fatto che conosciamo già tutte le stringhe che avremo all'inizio, mentre le prime non possono.
Presumibilmente 'array.fromstring' non è stato ottimizzato nel modo in cui' str.join' ha. – abarnert
Inoltre, si noti che questo articolo è del 2004. L'aggiunta di Naive str è molto più veloce nelle versioni più recenti di Python, e così è 'str.join' ... – abarnert
Ciò che @abarnert dice è totalmente rilevante. Quando l'articolo è stato scritto, l'ultima versione di Python era 2.3.3 (vedi http://www.python.org/download/releases/ e http://www.python.org/download/releases/2.3.4/). I benchmark fatti in quel momento sono in gran parte privi di significato oggi. –