如何分析Python代码的性能?

问题描述 投票:0回答:2

问候。要分析Python代码的性能,下面的代码可以吗?

import time

to = time.clock(); x = [];
for i in range(0,4):
    x.append(i*0.1);
tend = time.clock(); print(tend-to);

to = time.clock();
y = list(map(lambda x: x*0.1, list(range(0,4))));
tend = time.clock(); print(tend-to);

计时器显示不一致。但有时,两个计时器的结果也显示出不一致(有时第一个计时器更快,有时第二个计时器更快,尽管第一个计时器往往更快)。一些输出:

4.631622925399206e-05
4.4898385501326854e-05

4.9624531343562917e-05
6.852911471254275e-05

5.0569760512011734e-05
4.867930217511418e-05

3.78091667379527e-05
2.5993802132341648e-05

我的问题与上面的代码有关:

  • 我认为计时器计算代码性能应该是一致的?如何知道一种语法或策略比另一种表现得更好? (比其他运行效率更高)对此有什么想法吗?

先谢谢了。问候,阿里夫

python-3.x performance-testing
2个回答
0
投票

将代码包装在函数中并使用函数装饰器(例如

@function_timer()
)不是更优雅吗?例如:

from timer import function_timer

@function_timer()
def my_function():
    x = [];
    for i in range(0,4):
        x.append(i * 0.1);

my_function()

终端输出有点像这样:

Elapsed time: 7.79 microseconds for thread MY_FUNCTION

PS:完全公开,我是Timer for Python的作者,这是一个轻量级包,可以轻松测量代码的时间和性能。


-1
投票

来自官方文档

>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.3018611848820001
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.2727368790656328
>>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
0.23702679807320237

换句话说:如果我们努力谈论执行时间测量的精度 - 我们限制迭代一个简单的函数数千次以引发所有副作用。

© www.soinside.com 2019 - 2024. All rights reserved.