如何从python脚本中对C程序进行基准测试?

时间:2016-07-28 16:28:33

标签: python subprocess benchmarking timeit

我目前正在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程序进行基准测试的准确方法吗?

2 个答案:

答案 0 :(得分:1)

timeit将测量运行它的Python进程使用的CPU时间。外部流程的执行时间不会被记入"那些时候。

答案 1 :(得分:-1)

更准确的方法是在C中进行,您可以获得真正的速度和吞吐量。