有没有比 np.diff 更快的替代品?

Mat*_*w K 5 python performance numpy time-complexity

我关心以下函数的速度:

def cch(tau):
    return np.sum(abs(-1*np.diff(cartprod)-tau)<0.001)
Run Code Online (Sandbox Code Playgroud)

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

cartprod = np.ndarray([[0.0123,0.0123],[0.0123,0.0459],...])
Run Code Online (Sandbox Code Playgroud)

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

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

小智 4

我认为你通过重复返回多个长度约为 2500 万的 np.arrays 来碰壁,而不是 np.diff 很慢。我编写了一个等效的函数,它迭代数组并在数组运行过程中计算结果。该函数需要使用 numba 进行抖动才能快速运行。我希望这是可以接受的。

\n\n
arr = np.random.rand(25000000, 2)\n\ndef cch(tau, cartprod):\n    return np.sum(abs(-1*np.diff(cartprod)-tau)<0.001)\n%timeit cch(0.01, arr)\n\n@jit(nopython=True)\ndef cch_jit(tau, cartprod):\n    count = 0\n    tau = -tau\n    for i in range(cartprod.shape[0]):\n        count += np.less(np.abs(tau - (cartprod[i, 1]- cartprod[i, 0])), 0.001)\n    return count\n%timeit cch_jit(0.01, arr)\n
Run Code Online (Sandbox Code Playgroud)\n\n

产生

\n\n
294 ms \xc2\xb1 2.82 ms \n42.7 ms \xc2\xb1 483 \xc2\xb5s \n
Run Code Online (Sandbox Code Playgroud)\n\n

大约快 6 倍。

\n

  • 1) 在循环之前通过断言语句 `assert cartprod.shape[1]==2` 可以获得 30-40% 的改进(取决于您的处理器)。有了这些信息,编译器就可以对循环进行 SIMD 向量化。https://github.com/numba/llvmlite/issues/270 2) 在 timeit 调用之前至少调用一次 jitted 函数,否则您将测量编译和运行时的混合。(您的结果将取决于 timeit 调用该函数的次数) (3认同)