我正在做一些索引,内存是足够的,但是CPU不够。所以我有一个很大的字典,然后是一个较小的字典,我要合并到更大的字典中:
big_dict = {"the" : {"1" : 1, "2" : 1, "3" : 1, "4" : 1, "5" : 1}}
smaller_dict = {"the" : {"6" : 1, "7" : 1}}
#after merging
resulting_dict = {"the" : {"1" : 1, "2" : 1, "3" : 1, "4" : 1, "5" : 1, "6" : 1, "7" : 1}}
我的问题是两个dict中的值,当我的优先级是使用尽可能多的内存来最大限度地利用我的CPU时,我应该使用dict(如上所示)还是list (如下所示)?
为了便于说明,使用列表将如下所示:
big_dict = {"the" : [1, 2, 3, 4, 5]}
smaller_dict = {"the" : [6,7]}
#after merging
resulting_dict = {"the" : [1, 2, 3, 4, 5, 6, 7]}
附注:我之所以使用嵌套在字典中的字典而不是嵌套在字典中的集合,是因为JSON不允许我执行json.dumps,因为集合不是键/值对,它(就JSON库而言) {"a","series","of",“key”}
另外,在选择使用dict to a list之后,我将如何实现最有效的合并它们的CPU方法呢?
我很感谢你的帮助。
发布于 2010-05-17 12:59:33
嗯。我首先选择字典方法,因为Python有一个最微调的字典实现,所以我非常怀疑使用列表字典能得到更好的结果。
至于合并字典,这应该足够了:
for key, value in smaller_dict.iteritems():
try:
big_dict[key].update(value)
except KeyError:
big_dict[key] = dict(value)
我可能还会尝试将json.JSONEncoder
子类化,以便能够序列化set类型:
class SetEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, set):
return dict.fromkeys(obj)
return json.JSONEncoder.default(self, obj)
但是,后一种方法可能会在序列化方面增加一些开销,而且您还需要在反序列化时将这些字典转换为集合,方法是对json.JSONDecoder
进行子类化,或者在额外的步骤中自己执行此操作。
发布于 2010-05-17 13:08:53
这真的取决于你想如何处理你内部列表/字典中的值。如果在添加新条目时,您希望内部列表只有唯一的值,那么对于大型列表,列表实现将会慢得多。它的规模大致为O(n),而不是字典的O(1)平均大小写。
如果你不关心那些内部列表中的倍数,那么它是一个更接近的东西。
我会像你一样使用字典。Python的字典非常高效(有人曾尝试用C语言为实时应用程序实现字典数据结构)。
至于不使用集合。调整序列化会更好(你会说,因为内存不是问题),并且让代码的速度关键部分尽可能简单。反序列化后,只需遍历列表并将其转换为集合:
big_dict = {"the" : [1, 2, 3, 4, 5]} # imagine we got this from JSON
for key, value in big_dict:
big_dict[key] = set(value)
应该做这件事。除非您一直在序列化/反序列化整个索引,否则增加的预处理成本应该在足够多的请求上摊销,这一点无关紧要。
或者,您可以将编码器和解码器注册到JSON,这样您就可以自动执行此转换。然而,当问题如此小和受控制时,我通常不会费心。
因此,在基于字典的方法中,您可以这样做:
for key, value in smaller_dict.items():
if key in big_dict:
big_dict[key].update(value)
else:
big_dict[key] = value
如果希望big_dict仅复制字典,请在最后一行使用dict(value)
而不是value
。你也可以在最后一个循环中使用try:
和except KeyError
,但是if
...else
要快一点(在我的机器上,YMMV)。
发布于 2010-05-17 13:24:45
对于这类东西,任何散列容器都比列表要好。
我仍然使用set
而不是dict
;如果您在使用json.dumps
时遇到问题,您可以通过在转到serialize:dict.fromkeys(the_set, 1)
时将集合转换为字典来解决这个问题,并将其提取出来:set(the_dict.keys())
这比注册JSON提供者要容易得多。
至于合并:merged_set = bigger_set.union(smaller_set)
https://stackoverflow.com/questions/2849101
复制相似问题