gpt4 book ai didi

python - 快速按元素对 numpy 数组求和

转载 作者:太空狗 更新时间:2023-10-29 18:08:17 24 4
gpt4 key购买 nike

假设我想对 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

Reduce 要快得多(几乎快两个数量级):

timeit.timeit('reduce(add,tosum)',
setup='from numpy import add; from __main__ import tosum',
number=10000)
1.131795883178711

看起来 reduce 甚至比非 numpy 总和有一个有意义的领先优势(请注意,这些是针对 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 数组仍然会导致性能下降。

最佳答案

以下与 reduce 竞争,如果 tosum 列表足够长,则速度更快。但是,它的速度并没有很多,而是更多的代码。 (reduce(add, tosum) 确实很漂亮。)

def loop_inplace_sum(arrlist):
# assumes len(arrlist) > 0
sum = arrlist[0].copy()
for a in arrlist[1:]:
sum += a
return sum

原始 tosum 的时间。 reduce(add, tosum) 更快:

In [128]: tosum = [rand(100,100) for n in range(10)]

In [129]: %timeit reduce(add, tosum)
10000 loops, best of 3: 73.5 µs per loop

In [130]: %timeit loop_inplace_sum(tosum)
10000 loops, best of 3: 78 µs per loop

时间更长的数组列表。现在 loop_inplace_sum 更快。​​

In [131]: tosum = [rand(100,100) for n in range(500)]

In [132]: %timeit reduce(add, tosum)
100 loops, best of 3: 5.09 ms per loop

In [133]: %timeit loop_inplace_sum(tosum)
100 loops, best of 3: 4.4 ms per loop

关于python - 快速按元素对 numpy 数组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com