是否有一个与Ruby符号等效的Python?
如果是这样,那是什么?
如果不是这样,我们是否只在字典中使用字符串作为键?
Answers:
不,python没有符号类型。
但是,字符串文字默认情况下为interned,其他字符串可以使用该intern
函数进行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
andd.b=2
和of当然会得到这样的价值print(d.a + d.b)
。不知道这是否会比d['b']
答案中的普通字典查找慢。