在 2.6 上合并 n 字典和添加值的最快方法 [重复]

Posted

技术标签:

【中文标题】在 2.6 上合并 n 字典和添加值的最快方法 [重复]【英文标题】:Fastest way to merge n-dictionaries and add values on 2.6 [duplicate] 【发布时间】:2013-04-16 16:33:15 【问题描述】:

我有一个字典列表,我想将它们合并到一个字典中,并将每个字典中的值添加到列表中。例如:

ds = [1: 1, 2: 0, 3: 0, 1: 2, 2: 1, 3: 0, 1: 3, 2: 2, 3: 1, 4: 5]

最终结果应该是单个字典:

merged = 1: 6, 2: 3, 3: 1, 4: 5

我对性能很感兴趣,正在寻找最快的实现,它可以将一个 n 字典列表合并到一个字典中并对值求和。一个明显的实现是:

from collections import defaultdict

merged = defaultdict(int)

for d in ds:
    for k, v in d.items():
        merged[k] += v

在 Python 2.6 中有更快的方法吗?

【问题讨论】:

nvm 这不是重复的,因为它只允许 2.6 或***.com/questions/3490738/how-to-sum-dict-elements @user1728853 每个字典平均有多大? 相当小,通常不到 500 件。 没有什么比你明显的实现更快了。 【参考方案1】:

defaultdict 仍然是最快的,我找到了一些通过缓存函数名称来加速它的方法,现在又找到了另一种显着加快速度的方法,只需迭代 for k in d 而不是使用 d.items() 或 @987654324 @

到目前为止的一些时间安排:

from random import randrange
ds = [dict((randrange(1, 1000), randrange(1, 1000)) for i in xrange(500))
      for i in xrange(10000)]

# 10000 dictionaries of approx. length 500

from collections import defaultdict

def merge1(dicts, defaultdict=defaultdict, int=int):
    merged = defaultdict(int)
    for d in dicts:
        for k in d:
            merged[k] += d[k]
    return merged

def merge2(dicts):
    merged = 
    merged_get = merged.get
    for d in dicts:
        for k in d:
            merged[k] = merged_get(k, 0) + d[k]
    return merged


def merge3(dicts):
    merged = 
    for d in dicts:
        for k in d:
            merged[k] = merged[k] + d[k] if k in merged else 0
    return merged


from timeit import timeit
for func in ('merge1', 'merge2', 'merge3'):
    print func, timeit(stmt='0(ds)'.format(func),
                       setup='from __main__ import merge1, merge2, merge3, ds',
                       number=1)

merge1 0.992541510164
merge2 1.40478747997
merge3 1.23502204889

【讨论】:

你确定这实际上更快吗? (我问是因为在过去,我发现对 Counter 对象求和非常慢。) @DSM 虽然重复也没关系,我认为时间在另一个线程中 我应该提到,我在 Python 2.6 上 @user1728853 是的,您可能需要尝试使用这些优化的两种解决方案,无论如何其他线程已经有时间

以上是关于在 2.6 上合并 n 字典和添加值的最快方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从大字典中弹出 N 项的最快方法

Python字典相同值的键合并

生成随机布尔值的最快方法

在字典中添加 NSIndexPath 作为键和 NSNumber 作为值的问题?

python 合并字典/拼接字典

有没有一种简单的方法可以拥有一个无法添加但可以修改其值的类字典对象?