Есть ли Python, эквивалентный символам Ruby? - PullRequest
67 голосов
/ 19 сентября 2010

Есть ли Python, эквивалентный символам Ruby?

  • Если так, то что это?

  • Если нет, то застряли ли мы с использованием строк в качестве наших ключей только в словарях?

Ответы [ 5 ]

70 голосов
/ 19 сентября 2010

Нет, у питона нет типа символа.

Однако строковые литералы интернированы по умолчанию, а другие строки можно интернировать с помощью функции intern. Поэтому использование строковых литералов в качестве ключей в словарях не менее производительно, чем использование символов в ruby.

17 голосов
/ 19 сентября 2010

Как уже говорили другие, в Python нет символа, но строки работают хорошо.

Чтобы избежать цитирования строк как ключей, используйте синтаксис конструктора dict ():

d = dict(
    a = 1,
    b = 2,
    c = "Hello there",
    )
10 голосов
/ 22 апреля 2014

Также для тех, кто интересуется: символы в 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.

6 голосов
/ 19 сентября 2010
  1. Нет, аналога нет.
  2. Нет, вы можете использовать каждый хешируемый объект в качестве ключа словаря.
3 голосов
/ 21 июля 2013

Не как первоклассный тип, но существует https://pypi.python.org/pypi/SymbolType.

...