我目前正在uni工作,需要为多个短C程序生成多个基准。我已经编写了一个python脚本来自动化这个过程。到目前为止,我一直在使用time
模块并基本上计算基准:
start = time.time()
successful = run_program(path)
end = time.time()
runtime = end - start
run_program
函数只使用subprocess
模块来运行C程序:
def run_program(path):
p = subprocess.Popen(path, shell=True, stdout=subprocess.PIPE)
p.communicate()[0]
if (p.returncode > 1):
return False
return True
然而,我最近发现这是测量经过的时间而不是CPU时间,即这种测量对来自OS的噪声很敏感。关于SO的类似问题表明timeit
模块更适合测量CPU时间,所以我已经适应了run方法:
def run_program(path):
command = 'p = subprocess.Popen(\'time ' + path + '\', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE); out, err = p.communicate()'
result = timeit.Timer(command, setup='import subprocess').repeat(1, 10)
return numpy.median(result)
但是从查看timeit
文档看来,timeit
模块似乎只适用于以字符串形式传入的python代码的小片段。因此,我不确定timeit
是否正在为此计算提供准确的结果。所以我的问题是:timeit
将为它运行的进程的每一步测量CPU,还是仅测量实际python(即subprocess
模块)代码运行的CPU时间?这是对一组C程序进行基准测试的准确方法吗?
答案 0 :(得分:1)
timeit
将测量运行它的Python进程使用的CPU时间。外部流程的执行时间不会被记入"那些时候。
答案 1 :(得分:-1)
更准确的方法是在C中进行,您可以获得真正的速度和吞吐量。