Чи існує Python, еквівалентний символам Ruby?
Якщо так, то що це?
Якщо ні, то ми застрягли з використанням рядків як наших ключів лише у словниках?
Чи існує Python, еквівалентний символам Ruby?
Якщо так, то що це?
Якщо ні, то ми застрягли з використанням рядків як наших ключів лише у словниках?
Відповіді:
Ні, python не має типу символу.
Однак рядкові літерали інтернуються за замовчуванням, а інші рядки можна інтернувати за допомогою intern
функції. Отже, використання рядкових літералів як ключів у словниках є не менш ефективним, ніж використання символів у ruby.
Як сказали інші, в Python немає символу, але рядки працюють добре.
Щоб уникнути цитування рядків як ключів, використовуйте синтаксис конструктора dict ():
d = dict(
a = 1,
b = 2,
c = "Hello there",
)
Також для тих, хто цікавиться: символи в Ruby при використанні в хеші дуже схожі на порожні об'єкти в python. Наприклад, ви можете зробити:
some_var = object()
а потім встановіть ключ словника як some_var:
some_dict = { some_var : 'some value' }
а потім виконайте стандартний пошук:
some_dict[some_var]
Однак, як зазначив sepp2k, це не приносить жодної переваги продуктивності. Насправді я зробив швидкий тест і майже не відзначив підвищення продуктивності:
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]
Перевірена швидкість в 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
Тож у моєму випадку «символи» працюють повільніше! (для веселих цифр, не точних). Однак слід зазначити, що, мабуть, є переваги пам’яті, якщо робити це таким чином. Якщо вас не хвилює ключовий тип, об’єкти мають менший розмір, ніж рядки.
import sys
sys.getsizeof('some_var') # 45
some_var = object()
sys.getsizeof(some_var) # 0
Хоча це піднімає питання про те, як python обробляє пам'ять імені змінної some_var.
Не як першокласний тип, але існує https://pypi.python.org/pypi/SymbolType .
d.b
замістьd['b']
, ви могли б просто використовувати порожній ,class D(object): pass
щоб створити екземпляр ,d = D()
до якого ви можете призначити свої значення атрибутів , які складають, наприклад , такd.a=1
іd.b=2
і Звичайно, отримуйте їх значення такprint(d.a + d.b)
. Не впевнений, що це буде повільніше, ніж звичайний пошук словника, якd['b']
у відповіді.