In termini di funzionalità, come si è osservato, le visualizzazioni sono migliori. Per quanto riguarda la compatibilità, sono peggio.
Alcuni parametri di rendimento, prelevati da Python 2.7.2 su una macchina Ubuntu 64 bit:
>>> from timeit import timeit
Trattare con un dizionario vuoto:
>>> emptydict = {}
>>> timeit(lambda: emptydict.viewkeys())
0.24384498596191406
>>> timeit(lambda: list(emptydict.viewkeys()))
0.4636681079864502
>>> timeit(lambda: emptydict.iterkeys())
0.23939013481140137
>>> timeit(lambda: list(emptydict.iterkeys()))
1.0098130702972412
Costruire la vista è leggermente più costoso, ma consumare la vista è significativamente più veloce dell'iteratore (un po 'più del doppio della velocità).
Trattare con un dizionario mille-elemento:
>>> fulldict = {i: i for i in xrange(1000)}
>>> timeit(lambda: fulldict.viewkeys())
0.24295306205749512
>>> timeit(lambda: list(fulldict.viewkeys()))
13.447425842285156
>>> timeit(lambda: fulldict.iterkeys())
0.23759889602661133
>>> timeit(lambda: list(fulldict.iterkeys()))
15.45390510559082
stessi risultati, anche se meno marcata; la costruzione della vista è leggermente più costosa, ma consumarla è decisamente più veloce (15% più veloce).
Per confronto equo con list(dict.viewkeys())
e list(dict.iterkeys())
, dict.keys()
è distinctlyfaster:
>>> timeit(lambda: emptydict.keys())
0.2385849952697754
>>> timeit(lambda: fulldict.keys())
7.842105150222778
Sommario: si tratta di un trade-off; migliore funzionalità (che userete raramente) e prestazioni (che sarà solo molto raramente essere abbastanza significativo da preoccuparvi — se vi preoccupate di tali prestazioni, probabilmente siete già nella regione di dover lavorare con numpy/scipy) rispetto a una migliore compatibilità e all'utilizzo della memoria muscolare.
Personalmente, a meno che non sia già in funzione sulla funzionalità solo 2.7 o se non sto controllando in modo assoluto l'ambiente di runtime, evito le visualizzazioni del dizionario nel codice Python 2. Anche in questi casi, le mie dita vogliono ancora digitare iter
invece di view
, quindi le lascio!
* "Oltre alla compatibilità con le versioni precedenti di Python" * - la cosa è, è qualcosa che difficilmente si potrebbe chiamare irrilevante. Altrimenti, tutti useranno Python3.2 già – vartec
@vartec Non è irrilevante, ma è ovvio. –
ma poi di nuovo, a parte il fatto che 'iterkeys()' non ha vantaggio su 'viewkeys()'. – vartec