python 3.3,2.7和2.6 - 基准不一致的结果。怎么解决?

时间:2013-08-09 11:34:25

标签: python

我使用这个python脚本:

python2.6和2.7

for i in xrange(1000000):print i

python3.3

for i in range(1000000):print(i)

结果:

python 2.7

real    1m15.973s
user    0m3.392s
sys 0m6.384s

python 2.6

real    1m15.860s
user    0m3.064s
sys 0m6.296s

使用python 3.3我多次测试脚本,并且我收到了这个运行差异。

python 3.3

real    1m34.235s
user    0m10.668s
sys 0m8.988s

real    1m29.431s
user    0m10.304s
sys 0m9.512s

real    1m12.528s
user    0m10.568s
sys 0m9.004s

real    1m4.193s
user    0m9.688s
sys 0m8.812s

real    1m18.332s
user    0m9.728s
sys 0m9.132s

之后我再次尝试 python 2.6 ,我得到了这个:

real    0m45.003s
user    0m3.056s
sys 0m5.956s

对2个python脚本3.3和2.7(或2.6)进行基准测试的最佳方法是什么。

3 个答案:

答案 0 :(得分:7)

使用timeit module比较小型Python代码段。它避免了常见的陷阱,使时间值具有可比性。

但是,当计时sys.stdout时(和Python 3中的编码到终端编解码器),您通常将写入速度定时到print i

答案 1 :(得分:1)

请勿使用“打印”进行测试,请使用其他内容。

答案 2 :(得分:1)

有几种方法可以对Python程序进行基准测试。至少,我可以用两种严肃的方式来。您可以在这些幻灯片here中找到我所说的扩展版本。您也可以从PyCon 2013(来自Amjith Ramanujam)的Python分析谈论中受益于此video

cProfile模块

cProfile模块让您深入了解程序的每个过程所花费的时间。它可以以非常有效和精确的方式进行操作。但是,它的缺点是你不能相信它为每个程序提供的执行时间,而是相对于其他程序所花费的相对时间。

使用cProfile就像这样:

python -m cProfile ./mypythonprogram.py

如果您知道gprof,它将为您提供类似的输出,但是对于Python程序。

timeit模块

timeit模块旨在真正评估计划总共花费的时间。与cProfile相反,每个过程都没有额外的检测,因此在执行过程中没有减速。

def foo ():
    for i in range (10):
        i = i * i

from timeit import Timer
max_iter = 10000
t = Timer ("foo()", "from __main__ import foo")
print ("foo(%i): %f seconds" %(max_iter, t.timeit(max_iter)))

而且,你在命令行中这样称呼它:

$> python2.7 timeit_example.py
foo(10000): 0.012774 seconds
$> python3.2 timeit_example.py
foo(10000): 0.014030 seconds