Есть ли эквивалент Python для символов Ruby?
-
Если да, то что это такое?
-
Если нет, то мы застряли с использованием строк как наши ключи только в словарях?
Есть ли эквивалент Python для символов Ruby?
Если да, то что это такое?
Если нет, то мы застряли с использованием строк как наши ключи только в словарях?
Нет, у python нет символьного типа.
Однако строковые литералы интернированы по умолчанию, а другие строки могут быть интернированы с помощью функции intern
. Поэтому использование строковых литералов в качестве ключей в словарях не менее эффективно, чем использование символов в рубине.
Как говорили другие, в 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.