2010-04-30 11 views
29
$ python2.7 -m timeit 'd={}' 
10000000 loops, best of 3: 0.0331 usec per loop 
$ python2.7 -m timeit 'd=dict()' 
1000000 loops, best of 3: 0.19 usec per loop 

Perché utilizzare uno sull'altro?differenze tra "d = dict()" e "d = {}"

risposta

22

d=dict() richiede una ricerca in locals() poi globals() poi __builtins__, d={} non

+0

No, 'dict' è in' __builtin__'. –

+0

@MikeGraham yes ma nella maggior parte dei casi '__builtins__' è un alias per' __builtin__' – jamylak

9

Se le persone usano (appena) dict() over (solo) {}, è generalmente perché non conoscono {} (che è abbastanza una prodezza), o perché pensano che sia più chiaro (che è soggettiva, ma non comune.)

ci sono cose che puoi fare con dict che non si può fare con {}, anche se, come ad esempio passare a qualcosa che si aspetta una calla ble, come collections.defaultdict(dict). C'è anche il fatto che è possibile chiamare dict con argomenti a parola chiave, che alcune persone preferiscono:

>>> dict(spam=1, ham=2) 
{'ham': 2, 'spam': 1} 

Personalmente, preferisco la sintassi letterale dict perché funziona meglio quando si desidera utilizzare le chiavi che non sono identificatori validi:

>>> dict(pass=1) 
File "<stdin>", line 1 
    dict(pass=1) 
     ^
SyntaxError: invalid syntax 
>>> dict('ham and eggs'=1) 
    File "<stdin>", line 1 
SyntaxError: keyword can't be an expression 

(e mescolando stili solo perché alcuni tasti non sono identificatori validi, che schifo.)

42

io sono uno di quelli che preferisce le parole per la punteggiatura - è uno dei motivi che ho raccolto nel corso Python Perl, per esempio. "La vita è migliore senza parentesi" (un vecchio motto in pitone che è andato su una T-shirt con un cartone animato di un adolescente sorridente ;-), dopotutto (originariamente intendeva riferirsi a parentesi graffe contro indentazione per raggruppamento, ovviamente, ma, hey , le parentesi graffe sono bretelle! -).

"Pagamento" di alcuni nanosecondi (allo scopo di utilizzare una breve parola chiara e leggibile invece di parentesi graffe, parentesi e quant'altro) è generalmente conveniente (è soprattutto il costo delle ricerche nello spazio dei nomi incorporato, un prezzo che paga ogni volta che usi un tipo o una funzione incorporati e puoi ottimizzarlo leggermente recuperando alcune ricerche dai loop).

Quindi, io sono in genere quello che piace scrivere dict() per {}, list(L) al posto di L[:] nonché list() per [], tuple() per (), e così via - solo una preferenza stile generale per pronunciabile codice. Quando lavoro su una base di codice esistente che usa uno stile diverso, o quando i miei compagni di squadra in un nuovo progetto hanno forti preferenze nell'altro, posso accettarlo, ovviamente (non senza tentare un po 'di evangelizzazione nel caso dei compagni di squadra, anche se ;-).

+0

"sollevamento di alcune ricerche da loop" - cosa significa? – Tshepang

+9

@Tshepang, ad es. invece di 'for i in x: f (dict())' (che esegue 'len (x)' cerca il nome 'dict'), prima associa un' d = dict locale al di fuori del ciclo, quindi 'for i in x: f (d()) 'che esegue una ricerca _local_ più veloce per il nome' d').È una tecnica Python fondamentale per ottimizzare alcuni loop quando sono provati (tramite la creazione di profili, ovviamente) come colli di bottiglia delle prestazioni. –

+1

Incidentalmente (e non correlato a questa domanda, ovviamente), Ungeren Swallow dovrebbe rendere questo tipo di idioma (d = dict) non necessario :) – rbp

1

Come ha detto Thomas, io uso dict() in modo da poter specificare le parole chiave. Soprattutto se sto costruendo manualmente un grande dizionario per l'inizializzazione dei dati o altro: essere in grado di utilizzare la sintassi delle parole chiave mi consente di risparmiare due sequenze di tasti (e l'ammasso visivo associato) per ogni elemento.

6

Doug Hellmann ha scritto un esaustivo comparison della differenza di prestazioni.