2013-08-29 12 views
5

Nell'articolo link sottostante, l'autore paragona l'efficacia di diverse metodologie concatenazione di stringhe in Python: http://www.skymind.com/~ocrow/python_string/Perché sono liste più veloce di array di caratteri per la concatenazione di stringhe

Una cosa che non ho capito è, perché il metodo 3 (Matrici di caratteri mutevoli) si traducono in prestazioni significativamente più lente rispetto al metodo 4 (unendo un elenco di stringhe)

entrambi sono mutabili e penso che dovrebbero avere prestazioni comparabili.

+0

Presumibilmente 'array.fromstring' non è stato ottimizzato nel modo in cui' str.join' ha. – abarnert

+3

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

+0

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. –

risposta

4

"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.

+0

"Utilizza due passaggi, per calcolare prima le dimensioni necessarie, quindi copiare tutto in esso." - veramente?È un'ottimizzazione specifica per elenco di cui non ero a conoscenza? Non può funzionare per iterables generali. – user2357112

+0

Ah, fa una tupla fuori dall'input se non è già una tupla o lista. – user2357112

+1

Il tuo link 'bytes_join' è rotto. Prova ['string_join'] (http://hg.python.org/cpython/file/2.7/Objects/stringobject.c#l1586). – user2357112

Problemi correlati