有效计算数组中N个最小数字的和
我有一个代码,首先我需要排序值,然后我需要总结前10个元素。 我很乐意使用Numba软件包来加速运行时间,但它不起作用,Numba的代码比Numpy慢。
我的第一个测试,只是为了总结:
import numpy as np
import numba
np.random.seed(0)
def SumNumpy(x):
return np.sum(x[:10])
@numba.jit()
def SumNumpyNumba(x):
return np.sum(x[:10])
我的测试:
x = np.random.rand(1000000000)
%timeit SumNumpy(x)
%timeit SumNumpyNumba(x)
结果:
100000个循环,最好每个循环3:6.8μs
1000000个循环,最好是3:每个循环715ns
这里没关系,Numba正在做一件好事。 但是当我一起尝试np.sort和np.sum时:
def sumSortNumpy(x):
y = np.sort(x)
return np.sum(y[:10])
@numba.jit()
def sumSortNumpyNumba(x):
y = np.sort(x)
return np.sum(y[:10])
并测试:
x = np.random.rand(100000)
%timeit sumSortNumpy(x)
%timeit sumSortNumpyNumba(x)
结果:
100个循环,每个循环最好3:14.6 ms
10次循环,最好3次:每循环20.6毫秒
Numba / Numpy比Numpy慢。 所以我的问题是否有我们可以改进功能“sumSortNumpyNumba”?
我感谢帮助。
谢谢。
我们在排序后进行求和,因此在第一个N=10
元素内顺序不会有关系。 因此,我们可以使用np.argpartition
来避免排序步骤,并简单地给我们提供前N
最小数字的组,
def sumSortNumPyArgpartition(x, N=10):
return x[np.argpartition(x, N)[:N]].sum()
计时各种数据集 -
In [39]: np.random.seed(0)
...: x = np.random.rand(1000000)
In [40]: %timeit sumSortNumpy(x)
...: %timeit sumSortNumPyArgpartition(x)
10 loops, best of 3: 78.6 ms per loop
100 loops, best of 3: 12.3 ms per loop
In [41]: np.random.seed(0)
...: x = np.random.rand(10000000)
In [42]: %timeit sumSortNumpy(x)
...: %timeit sumSortNumPyArgpartition(x)
1 loop, best of 3: 920 ms per loop
10 loops, best of 3: 153 ms per loop
In [43]: np.random.seed(0)
...: x = np.random.rand(100000000)
In [44]: %timeit sumSortNumpy(x)
...: %timeit sumSortNumPyArgpartition(x)
1 loop, best of 3: 10.6 s per loop
1 loop, best of 3: 978 ms per loop
链接地址: http://www.djcxy.com/p/62931.html
上一篇: Efficiently compute sum of N smallest numbers in an array