2013-02-16 123 views
1

我期待使用Python作为系统来测试其他进程的时间,数据I/O,正确性等。我真正感兴趣的是时间精度。例如使用Python进行基准测试

start = time() 
subprocess.call('md5sum', somelist) 
end = time() 
print("%d s", end-start) 

子进程是否会为被调用的函数添加相当大的开销。

编辑

几个简单的测试之后,那么它出现在我的最佳选择是使用subprocess但是我已经列入标准输出/标准错误指出与该通信调用它增加了约0.002338 s额外的时间来执行。

+2

旁注:你知道'/ usr/bin/time -v''吗? – 2013-02-16 01:06:52

+0

@JonasWielicki是的,然而,这并不总是可用于我想测试的系统。 – Blackninja543 2013-02-16 01:07:57

+0

奇怪,你有python那里。 '''' – 2013-02-16 01:10:23

回答

0

使用timeit

import timeit 
timeit.timeit('yourfunction') 

更新

如果你是在Linux,那么你可以使用time命令,就像这样:

import subprocess 
result = subprocess.Popen(['time', 'md5sum', somelist], shell = False, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate() 
print result 
+1

这不是特别有用,如果你想调用子进程(因为它增加了另一层开销) – 2013-02-16 01:11:13

+1

@JonasWielicki但是,比'start'和'end'好。 – ATOzTOA 2013-02-16 01:13:02

+0

@ATOzTOA我不使用'time'命令的全部原因是它可能并不总是以相同的形式存在。我使用Python的原因是我知道2.6将永远存在于我将要使用的环境中。 – Blackninja543 2013-02-16 01:24:11

0

如果你的计时器脚本不关心它的程序的stdout/stderr,只需将输出传输到文件或/ dev/null。这样可以避免读取蒸汽并将它们变成python字符串的开销。

start = time() 
subprocess.call(['md5sum'] + some_list, stdout=open('/dev/null', 'w'), 
    stderr=subprocess.STDOUT) 
delta = time.time() - start 

如果您不需要将stdout和stderr作为单独的流读取,请避免沟通()。它产生了第二个线程读取stderr,这增加了开销。