【发布时间】:2012-05-31 13:38:42
【问题描述】:
我需要实现一个函数,用于对具有可变节长度的数组元素求和。 所以,
a = np.arange(10)
section_lengths = np.array([3, 2, 4])
out = accumulate(a, section_lengths)
print out
array([ 3., 7., 35.])
我在这里尝试了cython 的实现:
https://gist.github.com/2784725
对于性能,我将在 section_lengths 都相同的情况下与纯 numpy 解决方案进行比较:
LEN = 10000
b = np.ones(LEN, dtype=np.int) * 2000
a = np.arange(np.sum(b), dtype=np.double)
out = np.zeros(LEN, dtype=np.double)
%timeit np.sum(a.reshape(-1,2000), axis=1)
10 loops, best of 3: 25.1 ms per loop
%timeit accumulate.accumulate(a, b, out)
10 loops, best of 3: 64.6 ms per loop
您对提高性能有什么建议吗?
【问题讨论】:
-
我实现了几个建议,在github上查看更新版本:gist.github.com/2784725/…,仍然需要63ms,所以没有明显改进
-
这可能不是重点,但我想我会提到...... numpy 已经为 all ufunc 提供了一些接近它的东西。
np.add.reduceat(a, section_lengths.cumsum())。它必须稍作更改(cumsum 在开始时缺少 0,而您会得到额外的结束切片)并且您可能可以使用 cython 超越速度,但它是一个非常好的功能/技巧。
标签: python performance numpy cython