python 消耗内存时使用系统 cpu 时间
python uses system cpu time when consuming memory
我注意到当 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中系统调用时间随着块大小的增加而减少,最终会达到与方法2相同的水平。同时系统调用时间成本的比例随着块大小的减小而减少,由于更快速地增加用户 -space 时间成本。
至于方法 3,它忽略了分配大量内存的开销,导致系统调用的开销极小,这在您的程序中基本上是不真实的(我知道它的作用!)。
我注意到当 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中系统调用时间随着块大小的增加而减少,最终会达到与方法2相同的水平。同时系统调用时间成本的比例随着块大小的减小而减少,由于更快速地增加用户 -space 时间成本。
至于方法 3,它忽略了分配大量内存的开销,导致系统调用的开销极小,这在您的程序中基本上是不真实的(我知道它的作用!)。