python - 有没有比 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
结局就是一切?我也对其他任何事情持开放态度。
编辑:谢谢大家的解决方案!
解决方案
我们可以利用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
关于如何控制多核功能。
推荐阅读
- elasticsearch - 如何使用附件插件在 Elasticsearch 中使用空格字符进行搜索?
- html - CSS,使用 nth-of-type() 选择器获取元素的第 2 次和第 3 次迭代
- java - 在 dateTimeFormat 之后年份更改为 0000
- amazon-ecs - 将自定义 conf 文件传递给 ECS 任务定义
- c# - LogMeIn GoToWebinar SDK 响应 403 Access denied
- reactjs - 无法解析 Firebase 配置文件 React
- ios - 如何在屏幕上快速显示数据
- java - 打开 zip 文件时出错或缺少 JAR 清单:build/tmp/expandedArchives/org.jacoco.agent
- c# - 在嵌套控件 (WinForm) 上运行时访问值
- javascript - 文档未在 javascript 上定义