假设我要对numpy数组列表进行元素求和:tosum = [rand(100,100) for n in range(10)]
我一直在寻找最好的方法。看起来numpy.sum很糟糕:timeit.timeit('sum(array(tosum), axis=0)',
setup='from numpy import sum; from __main__ import tosum, array',
number=10000)
75.02289700508118
timeit.timeit('sum(tosum, axis=0)',
setup='from numpy import sum; from __main__ import tosum',
number=10000)
78.99106407165527
减少速度要快得多(接近两个数量级):timeit.timeit('reduce(add,tosum)',
setup='from numpy import add; from __main__ import tosum',
number=10000)
1.131795883178711
看起来reduce甚至比non-numpy sum有一个有意义的领先优势(注意,这些是针对1e6运行的,而不是针对上述时间的1e4):timeit.timeit('reduce(add,tosum)',
setup='from numpy import add; from __main__ import tosum',
number=1000000)
109.98814797401428
timeit.timeit('sum(tosum)',
setup='from __main__ import tosum',
number=1000000)
125.52461504936218
还有其他方法我应该试试吗?有人能解释一下排名吗?
编辑
如果首先将列表转换为numpy数组,numpy.sum肯定更快:tosum2 = array(tosum)
timeit.timeit('sum(tosum2, axis=0)',
setup='from numpy import sum; from __main__ import tosum2',
number=10000)
1.1545608043670654
不过,我只对一次求和感兴趣,因此将数组转换为numpy数组仍然会导致实际的性能损失。