Python Ruby記号と同等のものはありますか?
もしそうならそれは何ですか?
そうでない場合、辞書でのみkeysとしてstringsを使用することにこだわっていますか?
いいえ、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 は存在します。