python消耗内存时使用系统cpu时间

标签 python numpy cpu-usage

我注意到当 python(可能只是 numpy?)占用内存时,系统 cpu 时间变得很重要。

例如,当运行以下代码时(numpy 多线程被禁用):

import numpy as np
a = np.random.rand(50, 50, 1000000)

大约 88% 的运行核心用于用户时间,12% 用于系统时间。

但是,当运行以下代码时:

for i in range(1000000):
    a = np.random.rand(50, 50)

所有 cpu 时间都用于用户时间。

我想了解:

(1) 为什么会这样?

(2) 我是否需要分析我的代码以使用更少的内存?请注意,当我说分析时,我不关心内存,而 walltime 是我唯一关心的。我只是担心太多的系统时间会减慢我的程序。

最佳答案

测试代码:

N=10000000
M=10

# Method 1
a=[]
for i in range(N):
    a.append(np.random.rand(M,M))

# Method 2
a = np.random.rand(M,M,N)

# Method 3
for i in range(N):
    a = np.random.rand(M,M)

linux time 命令的结果: Fig 1

还有:

Method 3 at M=10 and N=10000000
real  0m15.221s
user  0m15.169s
sys   0m0.016s

结果表明,方法 1 中系统调用时间随着 block 大小的增加而减少,最终将达到与方法 2 相同的水平。同时,系统调用时间成本的比例随着 block 大小的减小而减少,这是由于用户空间时间成本增长更快。

至于方法 3,它忽略了分配大量内存的开销,导致系统调用的开销极小,这在您的程序中基本上是不真实的(我知道它的作用!)。

关于python消耗内存时使用系统cpu时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471779/

相关文章:

python - 如何在 matplotlib 配置文件中定义次要刻度数

python - in line.split ('+' )[-1] 方括号中的-1在Python中表示什么

Python Threading.Timer正在调用命令而无需等待

python - 通过索引和字符串连接改进 python 代码的运行时间

php - Laravel REST API 和高 CPU 负载

python - 加载图形然后用它来构建 tflite?

python - 2 个数组之间的所有数字对

python - (M,N) 和 (N,) 数组之间的距离计算

java - 重绘占用CPU过多

Java程序(Tomcat)不断吃内存(RES in top)