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)
在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,安装,添加配置文件并调用它:
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)