Python - 在 dict 中用作 "dummy value" 的最便宜的数据类型是什么

Python - What is the cheapest data type to be used as "dummy value" in dict

我想问一下在 python dict 中用作虚拟值的最便宜的数据类型(就内存消耗和 hold/process 成本而言)是什么(唯一的键dict 对我很重要,值只是占位符)

例如:

d1 = {1: None, 2: None, 3: None}
d2 = {1: -1, 2: -1, 3: -1}
d3 = {1: False, 2: False, 3: False}

这里只有键(1、2、3)对我有用,值不是所以它们可以是任何值(只是用作占位符。我想知道的是我应该使用什么虚拟数据在这里。现在我使用 None,但不确定它是否是 "cheapest"。

P.S.,我知道仅存储键的最佳选择可能是使用 Set 而不是 dict(具有虚拟值)。但是,我这样做的原因是因为我想使用 SWIG 在 Python 和 C++ 之间交换数据。现在我已经想出了如何使用 SWIG 将 Python dict 作为 std::map 传递给 C++,但是找不到关于如何将 Python 设置为 C++ 作为 std::set 传递的任何信息。 ..

在此非常感谢帮助/指导!

python 3.4 64 位:

>>> import sys
>>> sys.getsizeof(None)
16
>>> sys.getsizeof(False)
24
>>> sys.getsizeof(1)
28
>>> 

所以 None 似乎是最好的选择(我只列出了不可变对象,忽略了字符串和元组)。请注意,这并不重要,因为这些对象通常会被缓存,因此大小不会乘以字典的元素数量(此外 None 保证 到单身)

也就是说,与为每个 key/value 对存储对该对象的引用的成本相比,实际对象的成本可以忽略不计。如果您的字典包含 1000 个值,则无论值的大小如何,您都需要存储 1000 个引用。

结论:只要你在任何地方都使用相同的参考就没关系,而且它比一套要贵得多,因为references 被存储为每个字典条目的值。

一种可能的替代方法是将 set 作为 json 表示形式(然后在 list 中)作为字符指针传递给 C++ 端,后者将对其进行解析使用 good json parser。除非您的值是大浮点值(或大整数),否则这将节省内存,因为对象方面已通过序列化消除。

>>> json.dumps(list(set(range(4,10))))
'[4, 5, 6, 7, 8, 9]'  # hard to beat that in terms of size!

您可以使用集合,但 SWIG 似乎只支持将 Python 列表作为 set 参数传递(或使用命名模板),而无需编写您自己的类型映射。示例 (Windows):

test.i*

%module test

%include <std_set.i>
%template(seti) std::set<int>;

%inline %{

#include <set>
#include <iostream>
void func(std::set<int> a)
{
    for(auto i : a)
        std::cout << i << std::endl;
}

%}

输出:

>>> import set
>>> s = test.seti([1,1,2,2,3,3])  # pass named template
>>> test.func(s)
1
2
3
>>> test.func([1,2,3,3,4,4])  # pass a list that converts to a set
1
2
3
4
>>> test.func({1,1,2,2,3})   # Actual set doesn't work.
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: in method 'func', argument 1 of type 'std::set< int,std::less< int >,std::allocator< int > >'