Python中的基准测试运行时

Python中的基准测试运行时,python,benchmarking,Python,Benchmarking,我必须对JSON序列化时间进行基准测试,并将其与thrift和Google的协议缓冲区的序列化时间进行比较。它还必须是Python语言 我计划使用Python分析器。 探查器是查找函数运行时的最佳方法吗?或者在函数调用前后输出时间戳是更好的选择吗 或者有更好的方法吗?从您链接到的文档中: 注意探查器模块旨在为给定程序提供执行概要文件,而不是用于基准测试目的(因此,有timeit可获得合理准确的结果)。这尤其适用于将Python代码与C代码进行基准测试:分析器为Python代码引入了开销,但对C

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

我计划使用Python分析器。

探查器是查找函数运行时的最佳方法吗?或者在函数调用前后输出时间戳是更好的选择吗


或者有更好的方法吗?

从您链接到的
文档中:

注意探查器模块旨在为给定程序提供执行概要文件,而不是用于基准测试目的(因此,有
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序列化使用三个方法调用,那么请围绕所有三个方法调用编写一个包装器,这应该是一个公平的比较。如果您必须只使用前两个调用一次来序列化一系列内容,请将前两个调用作为设置的一部分,并且只对第三个调用计时。