【发布时间】:2018-11-22 15:56:53
【问题描述】:
我有大约 40k 行,我想测试行上的各种选择组合。通过选择,我的意思是布尔掩码。口罩/过滤器的数量在250MM左右。
目前的简化代码:
np_arr = np.random.randint(1, 40000, 40000)
results = np.empty(250000000)
filters = np.random.randint(1, size=(250000000, 40000))
for i in range(250000000):
row_selection = np_arr[filters[i].astype(np.bool_)] # Select rows based on next filter
# Performing simple calculations such as sum, prod, count on selected rows and saving to result
results[i] = row_selection.sum() # Save simple calculation result to results array
我尝试过 Numba 和 Multiprocessing,但由于大部分处理是在过滤器选择中而不是在计算中,这并没有多大帮助。
解决这个问题的最有效方法是什么?有什么办法可以并行化吗?据我所知,我需要遍历每个过滤器,然后单独计算总和、产品、计数等,因为我不能并行应用过滤器(即使应用过滤器后的计算非常简单)。
感谢任何关于性能改进/加速的建议。
【问题讨论】:
-
Numba 中是否提供您想要应用的所有功能,或者至少易于实现?
-
对于所有 i,j 过滤器[i,j] ==0。使用 randint(2, ...) 代替。
-
嗨,是的,计算在 Numba 中很容易实现,但棘手的部分是应用过滤器 250MM 次的循环。
-
您在计算中从哪里获得过滤器数组?大小为 (250000000, 40000) 的布尔数组有 10TB,不适合 RAM。或者您想在应用过滤器的循环中创建一些随机数?
标签: python performance numpy parallel-processing multiprocessing