2013-03-17 12 views
17

Ogni semestre ho almeno uno studente Python che usa dict.update() per aggiungere un singolo/coppia chiave-valore, vale a dire .:pitone dict.update vs. pedice per aggiungere una coppia chiave singola/valore

mydict.update({'newkey':'newvalue'}) 

invece di

mydict['newkey'] = 'newvalue' 

non insegno questo metodo e non so dove stanno trovando esempi di questo, ma dico loro di non farlo perché è meno efficiente (crea presumibilmente un nuovo dict 2 elementi) e perché non standard.

Onestamente, posso capire il desiderio di utilizzare un metodo visibile piuttosto che questa sintassi - forse si sente più coerente con altre chiamate di metodo. Ma penso che assomigli ad un approccio newbie.

C'è qualche sapienza che qualcuno ha da offrire su questo punto?

+3

Qual è la tua domanda? Stai solo chiedendo se è una buona o cattiva idea usare 'update' in questo modo? – BrenBarn

+0

Penso che SO sia un posto dove porre domande * di programmazione * - Non è davvero un posto dove porre domande su * insegnamento della programmazione *. Come tale, questo sarà probabilmente chiuso abbastanza rapidamente. Buona fortuna nella tua ricerca però. – mgilson

+1

sì - e ragioni per cui. non è tanto una domanda di insegnamento. è una questione di se questo metodo sia inefficiente, sconsigliabile, ecc. la parte didattica è solo un sottofondo. Grazie per i commenti –

risposta

19

Un punto di riferimento mostra i vostri sospetti del suo impatto sulle prestazioni sembrano corrette:

$ python -m timeit -s 'd = {"key": "value"}' 'd["key"] = "value"' 
10000000 loops, best of 3: 0.0741 usec per loop 
$ python -m timeit -s 'd = {"key": "value"}' 'd.update(key="value")' 
1000000 loops, best of 3: 0.294 usec per loop 
$ python -m timeit -s 'd = {"key": "value"}' 'd.update({"key": "value"})' 
1000000 loops, best of 3: 0.461 usec per loop 

Che è, è circa sei volte più lento sulla mia macchina. Tuttavia, Python non è già una lingua che useresti se hai bisogno di prestazioni al top, quindi ti consiglio di usare qualsiasi cosa sia più leggibile nella situazione. Per molte cose, che sarebbe il modo [], anche se update potrebbe essere più leggibile in una situazione come questa:

configuration.update(
    timeout=60, 
    host='example.com', 
) 

& hellip; o qualcosa di simile.

+0

Il tempo impiegato per eseguire un aggiornamento indicizzato è irrilevante in qualsiasi applicazione significativa. La leggibilità di [] = s è molto più importante. Trovo la versione di aggiornamento molto meno ovvia. –

+0

@PeterWooster: Sono d'accordo che la leggibilità è più importante, ma personalmente trovo che l'aggiornamento sia più leggibile. – icktoofay

+0

ma probabilmente non hai mai scritto Fortran :) –

2

Aggiornamento del tasto direttamente è tre volte più veloce, ma YMMV:

$ python -m timeit 'd={"k":1}; d.update({"k":2})' 
1000000 loops, best of 3: 0.669 usec per loop 

$ python -m timeit 'd={"k":1}; d["k"] = 2' 
1000000 loops, best of 3: 0.212 usec per loop 
+0

bene che lo cuce, grazie! Devo iniziare a usare timeit –

0

Ci sono persone che si sentono che [] = non è un elemento sintattico valida in un linguaggio orientato agli oggetti, o di qualsiasi altro per quella materia . Ricordo di aver sentito questo argomento decenni fa quando lavoravo allo sviluppo del linguaggio APL. Quella sintassi è un residuo di Fortran ...

Personalmente non ho sottoscritto questa visione e sono abbastanza soddisfatto dell'assegnazione indicizzata. Ma ci sono quelli che sostengono che una vera chiamata al metodo sia migliore. E naturalmente è sempre bene avere più di una soluzione.

Modifica: Il vero problema qui è la leggibilità, non le prestazioni, l'assegnazione indicizzata ha subito perché molte persone trovano l'incarico più facile da leggere anche se meno teoricamente corretto.

Problemi correlati