Python中的基准测试运行时
我必须对JSON序列化时间进行基准测试,并将其与thrift和Google的协议缓冲区的序列化时间进行比较。它还必须是Python语言 我计划使用Python分析器。 探查器是查找函数运行时的最佳方法吗?或者在函数调用前后输出时间戳是更好的选择吗Python中的基准测试运行时,python,benchmarking,Python,Benchmarking,我必须对JSON序列化时间进行基准测试,并将其与thrift和Google的协议缓冲区的序列化时间进行比较。它还必须是Python语言 我计划使用Python分析器。 探查器是查找函数运行时的最佳方法吗?或者在函数调用前后输出时间戳是更好的选择吗 或者有更好的方法吗?从您链接到的文档中: 注意探查器模块旨在为给定程序提供执行概要文件,而不是用于基准测试目的(因此,有timeit可获得合理准确的结果)。这尤其适用于将Python代码与C代码进行基准测试:分析器为Python代码引入了开销,但对C
或者有更好的方法吗?从您链接到的
文档中:
注意探查器模块旨在为给定程序提供执行概要文件,而不是用于基准测试目的(因此,有timeit
可获得合理准确的结果)。这尤其适用于将Python代码与C代码进行基准测试:分析器为Python代码引入了开销,但对C级函数却没有,因此C代码似乎比任何Python代码都要快
因此,不,您不想使用profile
对代码进行基准测试。您想要使用profile
的目的是在您已经知道代码太慢之后,找出代码太慢的原因
您也不希望在函数调用前后输出时间戳。如果你不小心(使用错误的时间戳函数,让GC在测试运行的中间运行一个循环集合,包括循环计时中的测试开销等),那么就有太多的方法可以出错。
这是一种常用的基准测试方法:
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
函数接受字符串并对其执行某些操作。显然,有不同的方法来组织事情。)根据问题开始和结束时的时间戳分析python代码时,应该小心。这不考虑可能同时运行的其他进程
但是,你应该考虑看< /P>
嘿,谢谢!这正是我想要的。timeit模块非常完美。我曾经打算用分析器运行一组数据。timeit函数让我可以长时间运行少量数据,这非常适合这些序列化包,因为它们一次只允许序列化多达1M的小块数据。现在唯一的问题是如何准确地比较它们。Google协议缓冲区使用一个方法调用进行序列化,而thrift使用三个消息调用进行序列化,前两个消息调用设置内存空间。因此,我不知道如何准确地进行比较。@Nickthemagicman:如果您必须对每个thrift序列化使用三个方法调用,那么请围绕所有三个方法调用编写一个包装器,这应该是一个公平的比较。如果您必须只使用前两个调用一次来序列化一系列内容,请将前两个调用作为设置的一部分,并且只对第三个调用计时。