web-dev-qa-db-ja.com

Python Ruby記号と同等のものはありますか?

Python Ruby記号と同等のものはありますか?

  • もしそうならそれは何ですか?

  • そうでない場合、辞書でのみkeysとしてstringsを使用することにこだわっていますか?

68
pylonicon

いいえ、pythonにはシンボルタイプがありません。

ただし、文字列リテラルはデフォルトでインターンされ、他の文字列は intern 関数を使用してインターンできます。そのため、辞書でキーとして文字列リテラルを使用することは、Rubyでシンボルを使用することよりもパフォーマンスが劣ることはありません。

70
sepp2k

他の人が言ったように、Pythonにはシンボルはありませんが、文字列はうまく機能します。

文字列をキーとして引用しないようにするには、dict()コンストラクター構文を使用します。

d = dict(
    a = 1,
    b = 2,
    c = "Hello there",
    )
17
Ned Batchelder

また、興味がある人のために:ハッシュで使用される場合の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のメモリをどのように扱うかという問題が生じます。

10
MartianE
  1. いいえ、同等のものはありません。
  2. いいえ、すべてのハッシュ可能なオブジェクトを辞書キーとして使用できます。
6
Philipp

ファーストクラスのタイプではありませんが、 https://pypi.python.org/pypi/SymbolType は存在します。

3
Michael Wolf