2010-04-30 19 views

Respuesta

22

d=dict() requiere una búsqueda en locals() continuación globals() continuación __builtins__, d={} no

+0

No, 'dict' está en' __builtin__'. –

+0

@MikeGraham sí, pero en la mayoría de los casos '__builtins__' es un alias para' __builtin__' – jamylak

9

Si la gente usa (justo) dict() más (justo) {}, por lo general es porque no saben de {} (que es bastante una hazaña), o porque piensan que es más claro (que es subjetivo, pero poco común.)

Hay cosas que puede hacer con dict que no se puede hacer con {}, aunque, como pasarlo a algo que espera una calla ble, como collections.defaultdict(dict). También está el hecho de que se puede llamar dict con argumentos de palabras clave, que algunas personas prefieren:

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

Personalmente, prefiero la sintaxis literal dict, ya que funciona mejor cuando se desea utilizar las teclas que no son identificadores válidos:

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

(y estilos sólo porque algunas teclas no son identificadores válidos, qué asco de mezcla.)

42

que soy uno de los que prefiere las palabras de puntuacion - es una de las razones que he recogido sobre Python Perl, por ejemplo. "La vida es mejor sin llaves" (un viejo lema de Python que iba en una camiseta con una caricatura de un adolescente sonriente ;-), después de todo (originalmente tenía la intención de referirse a llaves frente a la sangría para agrupar, por supuesto, pero, oye , las llaves son llaves! -).

"Pagar" algunos nanosegundos (con el fin de utilizar una palabra breve clara y legible en lugar de llaves, corchetes y cosas por el estilo) es generalmente asequible (es sobre todo el costo de búsquedas en el espacio de nombres integrado, un precio que pague cada vez que use un tipo o función incorporada, y puede optimizarlo levemente alzando algunas búsquedas de bucles).

lo tanto, estoy en general, el que le gusta escribir dict() para {}, list(L) en lugar de L[:], así como para list()[], tuple() para (), y así sucesivamente - sólo una preferencia estilo general de pronunciables código. Cuando trabajo en una base de código existente que usa un estilo diferente, o cuando mis compañeros en un proyecto nuevo tienen preferencias fuertes en el otro sentido, puedo aceptar eso, por supuesto (no sin intentar un poco de evangelización en el caso de los compañeros de equipo, aunque ;-).

+0

"levantando algunas búsquedas de bucles" - ¿Qué significa esto? – Tshepang

+9

@Tshepang, p. Ej. en lugar de 'para i en x: f (dict())' (que hace búsquedas 'len (x)' para el nombre 'dict'), primero une un' d = dict' local fuera del ciclo, luego 'para i en x: f (d()) 'que hace una búsqueda _local_ más rápida para el nombre' d').Es una técnica fundamental de Python para optimizar algunos bucles cuando están probados (por el perfil, por supuesto) para ser cuellos de botella de rendimiento. –

+1

Dicho sea de paso (y no relacionado con esta pregunta en absoluto, por supuesto), Unladen Swallow debería hacer que este tipo de modismo (d = dict) sea innecesario :) – rbp

1

Como dijo Thomas, utilizo dict() para poder especificar palabras clave. Especialmente si estoy construyendo manualmente un diccionario grande para la inicialización de datos o lo que sea; el poder usar la sintaxis de palabras clave me ahorra dos pulsaciones de teclas (y el desorden visual asociado) para cada elemento.

6

Doug Hellmann escribió una exhaustiva comparison de la diferencia de rendimiento.