我想问一下在python dict中用作虚拟值的最便宜的数据类型(在内存消耗和保存/处理成本方面)是什么(只有dict的键对我很重要,值只是占位符)
举些例子 :
d1 = {1: None, 2: None, 3: None}
d2 = {1: -1, 2: -1, 3: -1}
d3 = {1: False, 2: False, 3: False}
Run Code Online (Sandbox Code Playgroud)
这里只有键(1,2,3)对我有用,值不是这样它们可以是任何值(仅用作占位符.我想知道的是我应该在这里使用的虚拟数据.现在我使用None,但不确定它是否是"最便宜的".
PS,我知道只存储键的最佳选择可能是使用Set而不是dict(带虚拟值).但是,我这样做的原因是因为我想使用SWIG在Python和C++之间交换数据.现在我已经想出如何使用SWIG将Python dict传递给C++作为std :: map,但是找不到任何关于如何将Python Set作为std :: set传递给C++的东西......
这里非常感谢帮助/指导!
python 3.4 64bit:
>>> import sys
>>> sys.getsizeof(None)
16
>>> sys.getsizeof(False)
24
>>> sys.getsizeof(1)
28
>>>
Run Code Online (Sandbox Code Playgroud)
所以None似乎是最好的选择(我只列出了不可变对象,并忽略了字符串和元组).需要注意的是它没有多大那些对象通常缓存,所以大小不是由你的字典中元素的个数乘以(而且None是保证是一个singleton)
也就是说,与为每个键/值对存储对该对象的引用的成本相比,实际对象的成本是可忽略的.如果您的字典包含1000个值,则无论值的大小如何,您都有1000个存储引用.
结论:只要你在任何地方使用相同的引用并不重要,并且由于引用被存储为每个字典条目的值,因此它的成本远远超过集合.
一种可能的替代方法是将setas json表示(在a中list,然后)作为字符指针传递给C++端,它将使用一个好的json解析器来解析它.除非您的值是大浮点值(或大整数),否则可以节省内存,因为序列化消除了对象方面.
>>> json.dumps(list(set(range(4,10))))
'[4, 5, 6, 7, 8, 9]' # hard to beat that in terms of size!
Run Code Online (Sandbox Code Playgroud)