Python - 每次修改时在整个dict中找到平均值的最快方法?

Geo*_*ina 4 python iteration dictionary average

我正试图找到从字典中提取平均值的最快/最有效的方法.我正在处理的任务要求它执行数千次,所以每次只需迭代dict中的所有值,找到平均值就完全没有效率.数以百计的新键值对被添加到字典中,我们需要在每次发生时找到平均值.我们还需要在每次更新值时找到新的平均值,这会发生数千次.

在此先感谢 - 这是一个非常棒的地方.

Ned*_*der 11

创建自己的dict子类来跟踪计数和总数,然后可以快速返回平均值:

class AvgDict(dict):
    def __init__(self):
        self._total = 0.0
        self._count = 0

    def __setitem__(self, k, v):
        if k in self:
            self._total -= self[k]
            self._count -= 1
        dict.__setitem__(self, k, v)
        self._total += v
        self._count += 1

    def __delitem__(self, k):
        v = self[k]
        dict.__delitem__(self, k)
        self._total -= v
        self._count -= 1

    def average(self):
        if self._count:
            return self._total/self._count

a = AvgDict()
assert a.average() is None
a[1] = 1
assert a.average() == 1
a[2] = 10
assert a.average() == 5.5
assert a[2] == 10
a[1] = 5
assert a.average() == 7.5
del a[1]
assert a.average() == 10
Run Code Online (Sandbox Code Playgroud)