在python中对运行时进行基准测试

时间:2013-10-05 01:40:11

标签: python benchmarking

我必须对JSON序列化时间进行基准测试,并将其与thrift和google协议缓冲区的序列化时间进行比较。

它也必须在python中。

我打算使用python profilers。 http://docs.python.org/2/library/profile.html

分析器是否是查找函数运行时的最佳方法?

或者在函数调用之前输出时间戳是更好的选择吗?

还是有更好的方法吗?

提前致谢!

2 个答案:

答案 0 :(得分:5)

来自您关联的profile文档:

  

注意探查器模块旨在为给定程序提供执行配置文件,而不是用于基准测试目的(为此,timeit可获得相当准确的结果)。这特别适用于针对C代码对Python代码进行基准测试:分析器引入了Python代码的开销,但不是C级函数的开销,因此C代码似乎比任何Python代码都快。

所以,不,您不想使用profile对代码进行基准测试。您想要使用profile的目的是找出为什么您的代码太慢,在您已经知道它之后。

您也不想在函数调用之前和之后输出时间戳。如果您不小心(使用错误的时间戳函数,让GC在测试运行过程中运行循环收集,包括循环时序中的测试开销等),那么有太多事情你可能会出错。 。),timeit为你照顾所有这些。

像这样的东西是标记事物的常用方法:

for impl in 'mycode', 'googlecode', 'thriftcode':
    t = timeit.timeit('serialize(data)', 
                      setup='''from {} import serialize; 
                               with open('data.txt') as f: data=f.read()
                            '''.format(impl),
                      number=10000)
    print('{}: {}'.format(impl, t)

(我在这里假设您可以编写三个模块,将三个不同的序列化工具包装在同一个API中,一个serialize函数,它接受一个字符串并用它做一些事情。显然有组织事物的不同方式。)

答案 1 :(得分:2)

在根据问题开始和结束时的时间戳分析python代码时应该小心。这不会考虑可能同时运行的其他进程。

相反,您应该考虑查看

Is there any simple way to benchmark python script?