Python 从字典列表优化平均值计算

Python 从字典列表优化平均值计算,python,numpy,Python,Numpy,我有一个字典列表,上面有“a”、“n”、“o”、“u”键。 有没有一种方法可以加快计算速度,例如使用?列表中有成千上万的项目 数据是从数据库中提取的,所以我必须承认它最初是以字典列表的形式存在的 x = n = o = u = 0 for entry in indata: x += (entry['a']) * entry['n'] # n - number of data points n += entry['n'] o += entry['o'] u +=

我有一个字典列表,上面有“a”、“n”、“o”、“u”键。 有没有一种方法可以加快计算速度,例如使用?列表中有成千上万的项目

数据是从数据库中提取的,所以我必须承认它最初是以字典列表的形式存在的

x = n = o = u = 0
for entry in indata:
    x += (entry['a']) * entry['n']  # n - number of data points
    n += entry['n']
    o += entry['o']
    u += entry['u']

    loops += 1

average = int(round(x / n)), n, o, u

如果你想做的只是得到某件东西的平均值,为什么不呢

sum_for_average = math.fsum(your_item)
average_of_list = sum_for_average / len(your_item)

不要在numpy上胡闹。

我怀疑这会快得多,但我想它是
timeit
的候选者

from operator import itemgetter
x = n = o = u = 0
items = itemgetter('a','n','o','u')
for entry in indata:
    A,N,O,U = items(entry)
    x += A*N  # n - number of data points
    n += N
    o += O    #don't know what you're doing with O or U, but I'll leave them
    u += U

average = int(round(x / n)), n, o, u

至少,它保存了对
条目['n']
的查找,因为我现在已将其保存到变量中

您可以尝试以下操作:

def func2(数据): 平均值a=np.sum(np.array([d['a']表示数据中的d])*np.array([d['n']表示数据中的d])/len(数据) 回报率(平均值), np.sum([d['n']表示数据中的d]), np.sum([d['o']表示数据中的d]), np.sum([d['u']表示数据中的d]) )

def func3(数据): 数据帧=数据帧(数据) 返回np.sum((dframe[“a”]*dframe[“n”])/dframe.shape[0],np.sum(dframe[“n”]),np.sum(dframe[“o”]),np.sum(dframe[“u”])

在[3]中:%timeit func1(数据) 10个回路,最佳3个:59.6 ms/回路

在[4]中:%timeit func2(数据) 10个回路,最好为3个:每个回路138毫秒

[5]中的:%timeit func3(数据) 10个环路,最佳3个:每个环路129毫秒


如果您正在对数据执行其他操作,我肯定会考虑使用Pandas包。它的DataFrame对象与您正在使用的字典列表非常匹配。我认为大部分开销是将数据放入numpy数组或DataFrame对象的IO操作。

此c的目的是什么ode?周围的代码是什么?上下文有帮助。@JohnKugelman,稍微更新了一下问题。您可能可以使用
运算符进行一些优化。itemgetter
也许您的数据库可以对这些值求和。@mgilson,写一个如何做的示例,您可以向上投票。:)如何将字典列表转换为“您的列表”?使用“您的列表”作为一般占位符文本。如果你有一个字典条目,它是一组数字,那么数学模块中有几个函数应该会对你有所帮助。@AmigableClarkKant——我只是觉得当我可以同时从一个
dict
中获取多个东西时,这很酷。我以前从未这样做过,我想我会和你分享。在某个时候,也许我会做一个快速的
timeit
测试,看看它的性能如何……是的。顺便说一句,我在数据中分析了您的代码,似乎快了10%:-)我想现在看起来更漂亮了,所以我会用你的版本。再快一点、再漂亮一点就是一个净胜利。我简直不敢相信
itemgetter
能打败numpy。我想这里的瓶颈确实是将数据从字典中取出,并转换成
numpy
喜欢的格式。我很震惊。我认为造成瓶颈的肯定是IO进入numpy阵列。我不一定在这里使用术语
IO
,但你是对的。(我通常认为IO是对磁盘的读/写操作——但您已经提前建立了列表)。@mgilson,也许可以称之为“内存瓶颈”之类的东西

mean_a = np.sum(np.array([d['a'] for d in data]) * np.array([d['n'] for d in data])) / len(data)

import numpy as np
from operator import itemgetter
from pandas import *

data=[] for i in range(100000): data.append({'a':np.random.random(), 'n':np.random.random(), 'o':np.random.random(), 'u':np.random.random()})

def func1(data): x = n = o = u = 0 items = itemgetter('a','n','o','u') for entry in data: A,N,O,U = items(entry) x += A*N # n - number of data points n += N o += O #don't know what you're doing with O or U, but I'll leave them u += U

    average = int(round(x / n)), n, o, u
    return average