我需要function-aggregator,它会将两个列表减少到一个总数。 '项目'应该是布尔人的矢量。
所以,我写了这些函数:
def element_wise_multiplication(weights, items):
return map(lambda x, y: x * y, weights, items)
def total(weights, items):
return sum(element_wise_multiplication(weights, items))
他们看起来对我很好,但问题是分析器显示其中带有lambda的行占95%的运行时间,因此它的性能几乎是不可接受的。
实施它的最有效方法是什么?
P.S。我知道NumPy的数组,但我想在这个上使用PyPy。或者在这种情况下使用它不值得吗?
答案 0 :(得分:3)
您可以使用如下的生成器来处理:
from itertools import izip
value = sum((x * y) for x, y in izip(weights, items))
izip
完成与内置zip
相同的操作,但没有内存开销。
答案 1 :(得分:2)
虽然你提到不希望在这种情况下使用numpy,但可能值得一看速度差异。
最好的非numpy解决方案似乎是使用izip的生成器,它略微优于zip。
In [31]: %timeit sum(x*y for x,y in zip(weights,items))
10000 loops, best of 3: 158 us per loop
In [32]: %timeit sum(x*y for x,y in izip(weights,items))
10000 loops, best of 3: 125 us per loop
然而,当我们使用numpy数组时,我们得到:
In [33]: %timeit (np_weights,np_items).sum()
100000 loops, best of 3: 9.08 us per loop
numpy解决方案的速度提高了整整14倍。如果这确实是你代码中的瓶颈,那么numpy就是你要走的路。
答案 2 :(得分:1)
试试这个:
def total(weights, items):
return sum (x * y for x, y in zip(weights, items))