您可以尝试像这样做:
mean_a = np.sum(np.array([d['a'] for d in data]) * np.array([d['n'] for d in data])) / len(data)
编辑:实际上,@mgilson的上述方法更快:
import numpy as np
from operator import itemgetter
from pandas import *
数据=[]
对于i在range(100000)中:
数据.append({'a':np.random.random(), 'n':np.random.random(), 'o':np.random.random(), 'u':np.random.random()})
def func1(数据):
x = n = o = u = 0
items = itemgetter('a','n','o','u')
for entry in 数据:
A,N,O,U = items(entry)
x += A*N # n - 数据点数
n += N
o += O #不知道你在做什么O和U,但我会保留它们
u += U
average = int(round(x / n)), n, o, u
return average
def func2(data):
mean_a = np.sum(np.array([d['a'] for d in data]) * np.array([d['n'] for d in data]))/len(data)
return (mean_a,
np.sum([d['n'] for d in data]),
np.sum([d['o'] for d in data]),
np.sum([d['u'] for d in data])
)
def func3(data):
dframe = DataFrame(data)
return np.sum((dframe["a"]*dframe["n"])) / dframe.shape[0], np.sum(dframe["n"]), np.sum(dframe["o"]), np.sum(dframe["u"])
In [3]: %timeit func1(data)
10次循环,最好的结果:每个循环花费59.6毫秒
In [4]: %timeit func2(data)
10次循环,最好的结果:每个循环花费138毫秒
In [5]: %timeit func3(data)
10次循环,最好的结果:每个循环花费129毫秒
如果您正在对数据进行其他操作,我肯定会建议使用Pandas包。它的DataFrame对象非常适合与您正在使用的字典列表匹配。我认为大部分开销是将数据读取到numpy数组或DataFrame对象中的IO操作。
operator.itemgetter
进行优化。 - mgilson