python - ejemplos - django
¿Hay un Python equivalente a los símbolos de Ruby? (5)
¿Hay un Python equivalente a los símbolos de Ruby?
Si es así, ¿qué es?
Si no, ¿nos vemos obligados a usar cadenas como nuestras claves solo en los diccionarios?
- No, no hay equivalente.
- No, puede usar todos los objetos con capacidad de memoria como la clave del diccionario.
Como han dicho otros, no hay ningún símbolo en Python, pero las cadenas funcionan bien.
Para evitar citar cadenas como claves, use la sintaxis del constructor dict ():
d = dict(
a = 1,
b = 2,
c = "Hello there",
)
No como un tipo de primera clase, pero sí existe https://pypi.python.org/pypi/SymbolType .
No, Python no tiene un tipo de símbolo.
Sin embargo, los literales de cadena se internan por defecto y otras cadenas se pueden internar utilizando la función de intern
. Por lo tanto, el uso de literales de cadena como claves en los diccionarios no es menos eficaz que el uso de símbolos en ruby.
También para aquellos interesados: los símbolos en Ruby cuando se usan en hash son muy similares a los objetos vacíos en python. Por ejemplo, podrías hacer:
some_var = object()
y luego establece una clave de diccionario como some_var:
some_dict = { some_var : ''some value'' }
y luego hacer una recuperación estándar:
some_dict[some_var]
Sin embargo, como sepp2k señaló que no hay un beneficio en el rendimiento al hacer esto. De hecho, hice una prueba rápida y noté poco o ningún aumento en el rendimiento:
a, b, c, d, e = [object() for _ in range(5)]
dict_symbols = {a : ''a'', b : ''b'', c : ''c'', d : ''d'', e : ''e''}
dict_strings = {''a'' : ''a'', ''b'' : ''b'', ''c'' : ''c'', ''d'' : ''d'', ''e'' : ''e''}
def run_symbols():
for key in dict_symbols.keys():
dict_symbols[key]
def run_strings():
for key in dict_strings.keys():
dict_strings[key]
Velocidad probada en ipython:
In [3]: %timeit run_symbols
10000000 loops, best of 3: 33.2 ns per loop
In [4]: %timeit run_strings
10000000 loops, best of 3: 28.3 ns per loop
¡Entonces en mi caso los ''símbolos'' corren más despacio! (para números divertidos, no precisos). Sin embargo, debe tener en cuenta que probablemente haya ventajas de memoria para hacerlo de esta manera. Si no te importa el tipo de letra, los objetos tienen una huella más pequeña que las cadenas.
import sys
sys.getsizeof(''some_var'') # 45
some_var = object()
sys.getsizeof(some_var) # 0
Aunque eso plantea la cuestión de cómo Python trata la memoria del nombre de la variable some_var.