我必须对 JSON 序列化时间进行基准测试,并将其与 thrift 和 Google 的协议缓冲区的序列化时间进行比较。它也必须在 Python 中。
我打算使用 Python 分析器。 http://docs.python.org/2/library/profile.html
探查器会是查找函数运行时的最佳方式吗?还是在函数调用之前和之后输出时间戳是更好的选择?
还是有更好的方法?
我必须对 JSON 序列化时间进行基准测试,并将其与 thrift 和 Google 的协议缓冲区的序列化时间进行比较。它也必须在 Python 中。
我打算使用 Python 分析器。 http://docs.python.org/2/library/profile.html
探查器会是查找函数运行时的最佳方式吗?还是在函数调用之前和之后输出时间戳是更好的选择?
还是有更好的方法?
从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
函数接受一个字符串并用它做某事或其他事情。显然有不同的方式来组织事情。)