【发布时间】:2017-10-09 05:53:28
【问题描述】:
我有一个 Python dict-of-dict 结构,其中包含大量外部字典键(数百万到数十亿)。内部字典大多是空的,但可以存储键值对。目前我创建一个单独的字典作为每个内部字典。但它使用了大量我最终没有使用的内存。每个空字典都很小,但我有很多。我想延迟创建内部字典,直到需要。
理想情况下,我什至希望延迟创建内部字典,直到在内部字典中设置键值对。我设想对所有外部字典值使用单个 DelayDict 对象。对于 get 和 getitem 调用,这个对象就像一个空字典,但是一旦 setitem 或更新调用进来,它就会创建一个空字典来代替它。让 delaydict 对象知道如何将新的空 dict 与 dict-of-dict 结构连接起来,我遇到了麻烦。
class DelayDict(object): % can do much more - only showing get/set
def __init__(self, dod):
self.dictofdict = dod % the outer dict
def __getitem__(self, key):
raise KeyError(key)
def __setitem__(self, key, value):
replacement = {key: value}
% replace myself in the outer dict!!
self.dict-of-dict[?????] = replacement
我想不出如何将新的替换 dict 存储在 dict-of-dict 结构中,以便将 DelayDict 类替换为内部 dict。我知道属性可以做类似的事情,但我相信当我尝试在外部字典中替换自己时会出现同样的基本问题。
【问题讨论】:
-
这几乎正是
collections.defaultdict(dict)会做的事情,不是吗?如果需要更改行为,您可以对其进行子类化并覆盖__missing__方法。 -
defaultdict(dict)只会延迟创建内部字典,直到创建外部键。我想添加外部键而不必创建内部字典。 -
您需要区分没有内键的外键和根本不存在的外键吗?
-
我不需要区分有无内键的外键。现在我为这两种类型构建了一个内部字典,一种类型是空的。我想通过使用单个延迟字典而不是所有空的内部字典来消除所有这些空字典。困难的部分是弄清楚如何使延迟字典在需要时用真正的字典替换外部字典的“值”中的自身。看来我需要存储用于获取内部字典的外部键。
-
你不能有一个单一的内部对象占位符,因为它需要同时引用外部对象和相关键,否则保留对它的引用'没有正确的行为。因此,您最终会为每个缺失值创建一个实例,并且不会比为每个缺失值创建字典节省任何内容。
标签: python dictionary properties lazy-initialization