Python性能分析:统计每一行代码的执行时间

Python性能分析:统计每一行代码的执行时间

参考文章: A Guide to Analyzing Python Performance

line_profiler 安装

$ pip install line_profiler

写入装饰器

安装后line_profiler,可以访问名为“line_profiler”的新模块以及一个可执行脚本
kernprof.py。要使用这个工具,首先通过使用@profile 装饰要执行的函数。不必输入任何东西来使用这个装饰器。kernprof.py将在执行期间自动将其注入脚本。

@profile
def primes(n):
    if n == 2:
        return [2]
    elif n < 2:
        return []
    s = range(3,n+1,2)
    mroot = n ** 0.5
    half = (n+1)/2-1
    i = 0
    m = 3
    while m <= mroot:
        if s[i]:
            j = (m*m - 3)/2
            s[j] = 0
            while j < half:
                s[j] = 0
                j += m
        i = i + 1
        m = 2*i + 3
    return [2] + [x for x in s if x]
primes(100)

看看结果

即使终止(Ctrl+C)程序,也可以看到每一行代码的执行情况,可以很方便地帮助我们找到是哪一行拖慢了程序。

Wrote profile results to primes.py.lprof
Timer unit: 1e-06 s

File: primes.py
Function: primes at line 2
Total time: 0.00019 s

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     2                                           @profile
     3                                           def primes(n):
     4         1            2      2.0      1.1      if n==2:
     5                                                   return [2]
     6         1            1      1.0      0.5      elif n<2:
     7                                                   return []
     8         1            4      4.0      2.1      s=range(3,n+1,2)
     9         1           10     10.0      5.3      mroot = n ** 0.5
    10         1            2      2.0      1.1      half=(n+1)/2-1
    11         1            1      1.0      0.5      i=0
    12         1            1      1.0      0.5      m=3
    13         5            7      1.4      3.7      while m <= mroot:
    14         4            4      1.0      2.1          if s[i]:
    15         3            4      1.3      2.1              j=(m*m-3)/2
    16         3            4      1.3      2.1              s[j]=0
    17        31           31      1.0     16.3              while j

欢迎邮件至[email protected]与我交流讨论

你可能感兴趣的:(Python学习)