如何测量python函数的速度

Sye*_*aan 10 python performance performance-measuring

我通常在www.codefights.com上编写代码(函数)作为竞争对手.因此速度是代码的重要部分之一.我怎样才能测量python语言中某个代码的速度,无论是lambda函数还是def函数.

Ale*_*kov 11

例如:

import timeit

def a():
    return 1+1

print timeit.timeit(a, number=1000000)
Run Code Online (Sandbox Code Playgroud)


Man*_*nke 10

看看pythons标准libaray中的timeit模块:

https://docs.python.org/2/library/timeit.html

>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.8187260627746582
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723
>>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
0.5858950614929199
Run Code Online (Sandbox Code Playgroud)

要使timeit模块能够访问您定义的函数,可以传递包含import语句的setup参数:

def test():
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(i)

if __name__ == '__main__':
    import timeit
    print(timeit.timeit("test()", setup="from __main__ import test"))
Run Code Online (Sandbox Code Playgroud)


Ram*_*che 6

在3步;)

步骤1:安装line_profiler

pip install line_profiler
Run Code Online (Sandbox Code Playgroud)

第2步:添加@profile到您的代码中:

from time import sleep

@profile
def so_slow(bar):
    sleep(5)
    return bar

if __name__ == "__main__":
    so_slow(5)
Run Code Online (Sandbox Code Playgroud)

步骤3:测试您的代码:

kernprof -l -v your_code.py
Run Code Online (Sandbox Code Playgroud)

结果

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

Total time: 5.00283 s
File: your_code.py
Function: so_slow at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           @profile
     5                                           def so_slow(bar):
     6         1      5002830 5002830.0    100.0      sleep(5)
     7         1            2      2.0      0.0      return bar
Run Code Online (Sandbox Code Playgroud)

memory_profiler

您也可以使用memory_profiler,安装,添加配置文件并调用它:

pip install memory_profiler
python -m memory_profiler your_code.py
Run Code Online (Sandbox Code Playgroud)


结果:

Filename: your_code.py

Line #    Mem usage    Increment   Line Contents
================================================
     4   21.289 MiB    0.000 MiB   @profile
     5                             def so_slow(bar):
     6   21.289 MiB    0.000 MiB       sleep(5)
     7   21.289 MiB    0.000 MiB       return bar
Run Code Online (Sandbox Code Playgroud)

更新:

您可以使用objgraph查找memory leak或绘制代码图:

from time import sleep

import objgraph
x = [1]

objgraph.show_backrefs([x], filename='sample-backref-graph.png')

def so_slow(bar):
    sleep(5)
    return bar

if __name__ == "__main__":
    so_slow(5)
Run Code Online (Sandbox Code Playgroud)


结果:

在此处输入图片说明

参考:分析Python性能的指南