2010-05-07 1 views
7

Similar domande have been brought (confronto di buona velocità) su questo stesso subject. Speriamo che questa domanda sia diversa e aggiornata a Python 2.6 e 3.0.Velocità rispetto alla sicurezza e alla compatibilità rispetto ai metodi per eseguire concatenazioni di stringhe in Python

Finora credo che il metodo più veloce e più compatibile (tra le diverse versioni di Python) è la pianura semplice + segno:

text = "whatever" + " you " + SAY 

Ma io continuo a sentire e leggere non è sicuro e/o consigliabile.

Non sono nemmeno sicuro di quanti metodi ci sono per manipolare le stringhe! Potrei contare solo circa 4: c'è interpolation e tutte le sue opzioni secondarie come % e format e poi ci sono quelle semplici, join e +.

Infine, il new approach to string formatting, che è con format, non è certamente buono per la compatibilità all'indietro allo stesso tempo rendendo % non valido per la compatibilità diretta. Ma dovrebbe essere usato per ogni manipolazione di stringhe, inclusa ogni concatenazione, ogni volta che ci limitiamo solo a 3.x?

Beh, forse questo è più di un wiki che una domanda, ma desidero avere una risposta su che è l'uso corretto di ciascun metodo di manipolazione delle stringhe. E quale potrebbe essere generalmente utilizzato tenendo conto di ciascun obiettivo (il migliore in assoluto per compatibilità, velocità e sicurezza).

Grazie.

modifica: Non sono sicuro che dovrei accettare una risposta se non ritengo che risponda davvero alla domanda ... Ma il mio punto è che tutti e 3 insieme fanno un buon lavoro.

La risposta più votata di Daniel è in realtà quella che preferirei accettare, se non fosse per la "nota". Sono assolutamente in disaccordo con la "" la concatenazione usa strettamente l'operatore + per concatenare le stringhe " perché, per uno, join esegue anche la concatenazione di stringhe e possiamo creare qualsiasi libreria arbitraria per quello.

Tutte le attuali 3 risposte sono preziose e preferisco avere qualche risposta mescolandole tutte. Mentre nessuno si offre volontario per farlo, immagino che scegliendo quello meno votato (ma più ampio di THC4k, che è più come un commento grande e molto gradito) posso attirare l'attenzione anche sugli altri.

+0

Dove stai leggendo che '' + "non è sicuro e/o consigliabile"? –

+0

@John per uno, leggi le 2 risposte di seguito. Entrambi scoraggiano usando '+'. – cregox

+0

Forse interpretavo "consigliabile" in modo diverso da te. In ogni caso l'hai scritto prima che venissero scritte le risposte. Inoltre nessuna delle risposte indica che '+ =' è stato reso più veloce nei Python più recenti. Dove stai leggendo che '+' è "non sicuro"? –

risposta

3

utilizzando + è OK, ma non se è automatizzato:

a + small + number + of + strings + "is pretty fast" 

, ma questo può essere molto lento:

s = '' 
for line in anything: 
    s += line 

Utilizzare questo invece:

s = ''.join([line for line in anything]) 

Ci sono pro e contro di utilizzo + vs '%s%line' - utilizzando + mancherà qui:

s = 'Error - unexpected string' + 42 

Se si vuole che un'eccezione, o in silenzio fare qualcosa di insolito dipende dal tuo utilizzo.

+0

Ma stai dicendo che 'join' ha prestazioni migliori di' + 'anche per stringhe piccole? Mi azzarderei a dire che quasi tutti i software avranno quasi tutte le linee di codice con la concatenazione di stringhe piccole ... Ma la gente sembra parlare come se fosse il contrario quando si parla di questo argomento. – cregox

+6

's = '' .join ([line per line in qualsiasi cosa])' ha un loop pointless per costruire un elenco senza senso -> 's = ''. Join (qualsiasi cosa)' –

+1

@Cawas, per un piccolo numero di stringhe , non c'è una vera differenza. Per un numero elevato (ad esempio 100) di stringhe piccole (quando il risultato finale è una stringa grande), l'unione è più veloce. Entrambi dovrebbero essere molto veloci. La leggibilità è più importante. – wisty

5

Come nota: Davvero questo è tutto stringa costruzione e non la concatenazione, di per sé, come la concatenazione è strettamente utilizzando l'operatore + per concatenare le stringhe insieme uno dopo l'altro.

  • + (concatenazione) - generalmente inefficiente, ma può essere più facile da leggere per alcune persone, utilizzare solo quando la leggibilità è la priorità e le prestazioni non è (semplici script, script usa e getta, non le prestazioni del codice intensiva)
  • join (creazione di una stringa da una sequenza di stringhe) - utilizzare questo quando si dispone di una sequenza di stringhe che è necessario unire utilizzando un carattere comune (o nessun carattere se si desidera utilizzare la stringa vuota '' per partecipare on)
  • % e format (interpolazione) - fondamentalmente ogni altra operazione dovrebbe utilizzare uno di questi è appropriato, scegliere quale operatore/funzione è appropriato in base alla versione di Python che si desidera supportare per la durata del codice (utilizzare % per 2 .x e format per 3.x)
+0

Beh, il mio obiettivo qui è solo la concatenazione, non lo faccio Voglio davvero entrare nella formattazione delle stringhe e tutto il resto. Ma abbastanza giusto, parlando di 'format' e'% 'altre funzioni, sarebbe meglio dire" costruzione "e non ho nemmeno pensato a quella parola. Non lo so, pensi ancora che sia meglio se cambio il titolo? – cregox

+0

Per quanto riguarda la velocità di concatenazione, date un'occhiata a quel link che ho dato per il confronto di velocità. Saresti sorpreso.Inoltre, non voglio discutere di design/leggibilità qui. Penso che in questo caso sia molto soggettivo. – cregox

4

Il problema con + per le stringhe è uguale a quello di molte altre lingue: Ogni volta che estendi la stringa, questa viene copiata. Quindi, per costruire una singola stringa da 100 sottostringhe, Python copia ciascuno dei 99 passi.

E che prende un po 'di tempo:

# join 100 pretty short strings 
python -m timeit -s "s = ['pretty short'] * 100" "t = ''.join(s)" 
100000 loops, best of 3: 4.18 usec per loop 

# same thing, 6 times slower 
python -m timeit -s "s = ['pretty short'] * 100" "t = ''" "for x in s:" " t+=x" 
10000 loops, best of 3: 30 usec per loop 
+0

Grazie per questo chiarimento! – cregox