有没有更快的替代品np差异?

2024-06-13 13:22:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我关心的是以下函数的速度:

def cch(tau):
    return np.sum(abs(-1*np.diff(cartprod)-tau)<0.001)

其中,"cartprod"是列表的变量,如下所示:

^{pr2}$

这份名单的长度约为2500万。基本上,我试图找到一种更快速的方法来返回np.ndarray中每个对列表的差异列表。有没有比np.diff更快的算法或函数?或者,是np.diff结束都是全部吗?我也愿意接受其他任何事情。在

编辑:谢谢大家的解决方案!在


Tags: 函数列表returndefnpdiffabs速度
3条回答

array-slicing-

import numexpr as ne

def cch_numexpr(a, tau):
    d = {'a0':a[:,0],'a1':a[:,1]}
    return np.count_nonzero(ne.evaluate('abs(a0-a1-tau)<0.001',d))

25M大小的数据进行采样运行和计时-

^{pr2}$

大约6x加速。在

这是使用8线程的。因此,随着可用于计算的线程数量的增加,它应该得到进一步的改进。^{}介绍如何控制多核功能。在

我认为你重复返回多个np.数组长度约为2500万而不是np.差异慢一点。我写了一个等价的函数,它在数组上迭代,并在执行过程中计算结果。这个功能需要用numba进行抖动才能快速完成。我希望这是可以接受的。在

arr = np.random.rand(25000000, 2)

def cch(tau, cartprod):
    return np.sum(abs(-1*np.diff(cartprod)-tau)<0.001)
%timeit cch(0.01, arr)

@jit(nopython=True)
def cch_jit(tau, cartprod):
    count = 0
    tau = -tau
    for i in range(cartprod.shape[0]):
        count += np.less(np.abs(tau - (cartprod[i, 1]- cartprod[i, 0])), 0.001)
    return count
%timeit cch_jit(0.01, arr)

生产

^{pr2}$

大约快6倍。在

出于好奇,我比较了@Divakarnumexpr和@alexdornumba.jit的解。实现numexpr.evaluate的速度似乎是使用numba的jit编译器的两倍。每100次测试的结果如下:

np.sum:          111.07543396949768
numexpr:         12.282189846038818
JIT:             6.2505223751068115
'np.sum' returns same result as 'numexpr'
'np.sum' returns same result as 'jit'
'numexpr' returns same result as 'jit'

编写脚本,以便重现结果:

^{pr2}$

相关问题 更多 >