首页 > 解决方案 > 有没有比 np.diff 更快的替代方案?

问题描述

我关心以下功能的速度:

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

"cartprod"如下所示的列表的变量在哪里:

cartprod = np.ndarray([[0.0123,0.0123],[0.0123,0.0459],...])

这份名单的长度约为 2500 万。基本上,我正在尝试找到一种更快的方法来返回每个对列表中的差异列表np.ndarray。是否有比 更快的算法方式或功能np.diff?或者,np.diff结局就是一切?我也对其他任何事情持开放态度。

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

标签: pythonperformancenumpytime-complexity

解决方案


我们可以利用multi-core模块numexpr处理大数据,并在以下方面的帮助下获得内存效率和性能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对大小数据的样本运行和时间安排-

In [83]: cartprod = np.random.rand(25000000,2)

In [84]: cch(cartprod, tau=0.5) == cch_numexpr(cartprod, tau=0.5)
Out[84]: True

In [85]: %timeit cch(cartprod, tau=0.5)
10 loops, best of 3: 150 ms per loop

In [86]: %timeit cch_numexpr(cartprod, tau=0.5)
10 loops, best of 3: 25.5 ms per loop

围绕6x加速。

这是与8线程。因此,随着更多线程可用于计算,它应该会进一步改进。Related post关于如何控制多核功能。


推荐阅读