在python中用keywise将dict列表添加到一起的最快方法

2024-09-28 17:06:26 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一堆字典

a = {'x': 1.0, 'y': 0.5, 'z': 0.25 }
b = {'w': 0.5, 'x': 0.2 }

只有两个,但问题是关于一个自由裁量。在

找到每个键的平均值最快的方法是什么?dict是非常稀疏的,因此在很多情况下,许多键在不同的dict中都不存在。在

我要找的结果是一个新字典,里面有所有的键和每个键的平均值。这些值总是浮动的,我很乐意使用ctypes。我的方法比我想要的慢,可能是因为在我的例子中,我使用的是defaultdicts,这意味着我实际上正在初始化值,即使它们不存在。如果这是导致速度慢的原因,我很乐意重构,只想确保我没有遗漏任何明显的东西。在

编辑:我想我对结果应该是什么产生了误导,如果这个值没有出现,它应该是0.0,所以上面例子的结果是:

^{pr2}$

所以除法是按唯一键的总数。在

我想知道的主要问题是,有没有一种巧妙的方法可以在一步中将整个dict除以长度,或者在一步中完成加法。基本上是一个非常快速的向量加法和除法。我已经简单地看了numpy数组,但是它们似乎不适用于dict,如果我将dict转换为list,我就必须删除sparness属性(通过显式地将exavest值设置为0)。在


Tags: 方法编辑字典情况原因ctypesdict例子
3条回答
>>> def avg(items):
...     return sum(items) / len(items)
... 
>>> hashes = [a, b]
>>> dict([(k, avg([h.get(k) or 0 for h in hashes])) for k in set(sum((h.keys() for h in hashes), []))])
{'y': 0.25, 'x': 0.59999999999999998, 'z': 0.125, 'w': 0.25}

说明:

  1. 所有哈希中的键集,没有重复。在

    set(sum((h.keys() for h in hashes), []))
    
  2. 上面集合中每个键的平均值,如果特定哈希中不存在该值,则使用0。在

    (k, avg([h.get(k) or 0 for h in hashes]))
    

这是有效的:

import collections

data= [
    {'x': 1.0, 'y': 0.5, 'z': 0.25 },
    {'w': 0.5, 'x': 0.2 }
    ]

tally = collections.defaultdict(lambda: (0.0, 0))

for d in data:
    for k,v in d.items():
        sum, count = tally[k]
        tally[k] = (sum+v, count+1)

results = {}
for k, v in tally.items():
    t = tally[k]
    results[k] = t[0]/t[1]

print results

我不知道它是否比你的快,因为你还没有发布你的代码。在

^{pr2}$

我尝试在tally中避免再次存储所有的值,只是简单地累积最后计算平均值所需的总和和计数。Python程序中的时间瓶颈通常在内存分配器中,使用较少的内存可以大大提高速度。在

通过分析可以证明这不是最快的,但是。。。在

import collections

a = {'x': 1.0, 'y': 0.5, 'z': 0.25 }
b = {'w': 0.5, 'x': 0.2 }
dicts = [a,b]

totals = collections.defaultdict(list)
avg = {}

for D in dicts:
    for key,value in D.iteritems():
        totals[key].append(value)

for key,values in totals.iteritems():
   avg[key] = sum(values) / len(values)

我在猜测,允许Python使用内置的sum()和{}将比计算新值时的平均值获得一些性能,但我肯定是错的。在

相关问题 更多 >