首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >任何提高numpy.cumsum()速度的方法

任何提高numpy.cumsum()速度的方法
EN

Stack Overflow用户
提问于 2018-03-19 23:58:10
回答 1查看 1.3K关注 0票数 1

我有一个项目,我计算许多大型数组的累加和。在我的服务器上运行2秒时,这一步是一个很大的瓶颈。有没有什么办法可以加快速度呢?

请注意,这些数组表示温度测量。所以它们是浮点值,可以是负数,也可以是正数。虽然我有更多的内核可用,但我已经在其他地方使用并行处理,所以在这种情况下这不会加快速度。

代码语言:javascript
运行
复制
import numpy as np
import time

forcing = np.random.rand(380*1400*620).reshape((380,1400,620))

start = time.time()
forcing.cumsum(axis=0)
np_time = time.time() - start
print(np_time)
2.085033416748047
EN

回答 1

Stack Overflow用户

发布于 2018-03-20 00:45:15

作为mentioned by daniel451numpy不会并行化cumsum操作,因此您可以显式地将其并行化,以获得至少一点性能。

例如,使用multiprocessing.dummy ( multiprocessing应用程序接口的线程备份副本),您可以执行以下操作:

代码语言:javascript
运行
复制
import numpy as np
from multiprocessing.dummy import Pool
from itertools import repeat

forcing = np.random.rand(380*1400*620).reshape((380,1400,620))

# Make an output array of matching size, that can be populated piecemeal
# in each thread
forceres = np.zeros_like(forcing)

# Compute cumsum in parallel over second dimension
with Pool() as pool:
    # Use module function with np.rollaxis to avoid need to define
    # worker to do slicing
    pool.starmap(np.cumsum, zip(np.rollaxis(forcing, 1), repeat(0), repeat(None), np.rollaxis(forceres, 1)))

我在一台八核机器上用ipython3%time/%%time魔术对此进行了测试,发现与原始代码相比,它的运行时间减少了近70%,从5.49秒减少到1.73秒;您的机器明显更快,所以如果在您的机器上出现同样的速度提升,我预计它将花费大约0.66秒。

我的比较是:

代码语言:javascript
运行
复制
>>> %%time
... forcesres = np.zeros_like(forcing)
... with Pool() as pool:
...     pool.starmap(np.cumsum, zip(np.rollaxis(forcing, 1), repeat(0), repeat(None), np.rollaxis(forceres, 1)))
CPU times: user 10 s, sys: 213 ms, total: 10.2 s
Wall time: 1.73 s

代码语言:javascript
运行
复制
>>> %time forcing.cumsum(axis=0); None  # ; None avoids output
CPU times: user 5.27 s, sys: 218 ms, total: 5.49 s
Wall time: 5.49 s
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49367278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档