2013-10-05 99 views
1

我必须对JSON序列化时间进行基准测试,并将其与节俭和谷歌协议缓冲区的序列化时间进行比较。在Python中对基准运行时间进行基准测试

它也必须在python中。

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

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

或者会输出一个时间戳和之前的函数调用是更好的选择?

或者还有更好的方法吗?

在此先感谢!

回答

4

从您链接到profile文档:

注意探查器模块被设计为给定程序提供执行配置文件,不进行基准测试目的(即,有timeit为合理准确的结果)。这特别适用于将Python代码与C代码进行基准比较:分析器为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功能显然有不同的方式来组织事物)

+0

嘿感谢!这正是我所期待的。 timeit模块是完美的。 我打算用分析器运行一堆数据。 timeit函数让我可以运行一点ALOT的时间,这对于这些序列化包来说非常合适,因为它们只允许一次将最多1M个数据的小块进行序列化。 现在唯一的问题是如何准确地比较它们。 谷歌协议缓冲区使用一个方法调用序列化,而节俭序列化使用三个消息调用,前两个调用内存空间。 所以我不知道如何准确比较。 –

+0

@Nickthemagicman:如果你必须为每个节点序列化使用三个方法调用,那么围绕所有三个方法调用编写一个包装,它应该是一个公平的比较。如果您只需要使用前两个调用来序列化整个事件,则将前两个调用设置为设置的一部分,并且只需要第三次调用即可。 – abarnert