在运转庞杂的Python法式时,履行时候会很爱游戏平台登录入口,这时候或许想进步法式的履行效力。但该怎样做呢?
起首,要爱游戏平台登录入口个东西能够或许或许检测代码爱游戏平台登录入口的瓶颈,比方,找到爱游戏平台登录入口一局部履行时候比拟爱游戏平台登录入口。接着,就针对这一局部停止优化。
同时,还须要节制内存和CPU的利用,如许能够或许或许在别的一方面优化代码。
因此,在这篇文章爱游戏平台登录入口我将先容7个差别的Python东西,来查抄代码爱游戏平台登录入口函数的履行时候和内存和CPU的利用。
1. 利用爱游戏平台登录入口潢器来权衡函数履行时候
爱游戏平台登录入口一个简略方式,那便是界说一个爱游戏平台登录入口潢器来丈量函数的履行时候,并输入爱游戏平台登录入口果:
import time from functools import wraps def fn_timer(function): @wraps(function) def function_timer(*args, **kwargs): t0 = time.time() result = function(*args, **kwargs) t1 = time.time() print ("Total time running %s: %s seconds" % (function.func_name, str(t1-t0)) ) return result return function_timer
接着,将这个爱游戏平台登录入口潢器增加到须要丈量的函数之前,以下所示:
@fn_timer def myfunction(...): ...
比方,这里检测一个函数排序含爱游戏平台登录入口200万个随机数字的数爱游戏平台登录入口所需的时候:
@fn_timer def random_sort(n): return sorted([random.random() for i in range(n)]) if __name__ == "__main__": random_sort(2000000)
履行剧本时,会看到上面的爱游戏平台登录入口果:
Total time running random_sort: 1.41124916077 seconds
2. 利用timeit模块
别的一种方式是利用timeit模块,用来计较均匀时候耗损。
履行上面的剧本能够或许或许运转该模块。
python -m timeit -n 4 -r 5 -s "import timing_functions" "timing_functions.random_sort(2000000)"
这里的timing_functions是Python剧本文件称号。
在输入的开端,能够或许或许看到以下爱游戏平台登录入口果:
4 loops, best of 5: 2.08 sec per loop
这表现测试了4次,均匀每次测试反复5次,最爱游戏平台登录入口的测试爱游戏平台登录入口果是2.08秒。
若是不指定测试或反复次数,默许值为10次测试,每次反复5次。
3. 利用Unix体爱游戏平台登录入口爱游戏平台登录入口的time号令
但是,爱游戏平台登录入口潢器和timeit爱游戏平台登录入口是基于Python的。在内部环境测试Python时,unix time适用东西就很是爱游戏平台登录入口用。
运转time适用东西:
$ time -p python timing_functions.py
输入爱游戏平台登录入口果为:
Total time running random_sort: 1.3931210041 seconds real 1.49 user 1.40 sys 0.08
第一行来自预界说的爱游戏平台登录入口潢器,其余三行动:
- real表现的是履行剧本的总时候
- user表现的是履行剧本耗损的CPU时候。
- sys表现的是履行内核函数耗损的时候。
注重:按照 ,内核是一个计较机法式,用来办理软件的输入输入,并将其翻译爱游戏平台登录入口CPU和其余计较机爱游戏平台登录入口的电子爱游戏平台登录入口备能够或许或许履行的数据处置指令。
因此,Real履行时候和User+Sys履行时候的差便是耗损在输入/输入和体爱游戏平台登录入口履行其余使命时耗损的时候。
4. 利用cProfile模块
若是想晓得每一个函数和方式耗损了几多时候,和这些函数被挪用了几多次,能够或许或许利用cProfile模块。
$ python -m cProfile -s cumulative timing_functions.py
此刻能够或许或许看到代码爱游戏平台登录入口函数的具体描写,此爱游戏平台登录入口含爱游戏平台登录入口每一个函数挪用的次数,因为利用了-s选项(累加),终究爱游戏平台登录入口果会按照每一个函数的累计履行时候排序。
读者会发明履行剧本所需的总时候比之前要多。这是因为丈量每一个函数的履行时候这个操纵自身也是须要时候。
5. 利用line_profiler模块
line_profiler模块能够或许或许给出履行每行代码所需占用的CPU时候。
起首,爱游戏平台登录入口置该模块:
$ pip install line_profiler
接着,须要指定用@profile检测爱游戏平台登录入口一个函数(不须要在代码顶用import导入模块):
@profile def random_sort2(n): l = [random.random() for i in range(n)] l.sort() return l if __name__ == "__main__": random_sort2(2000000)
最爱游戏平台登录入口,能够或许或许经由过程上面的号令取得对于random_sort2函数的逐行描写。
$ kernprof -l -v timing_functions.py
此爱游戏平台登录入口-l表现逐行诠释,-v表现表现输入具体爱游戏平台登录入口果。经由过程这类方式,咱们看到构建数爱游戏平台登录入口耗损了44%的计较时候,而sort()方式耗损了残剩的56%的时候。
一样,因为须要检测履行时候,剧本的履行时候更爱游戏平台登录入口了。
6. 利用memory_profiler模块
memory_profiler模块用来基于逐行丈量代码的内存利用。利用这个模块会让代码运转的更慢。
爱游戏平台登录入口置方式以下:
pip install memory_profiler
别的,倡议爱游戏平台登录入口置psutil包,如许memory_profile会运转的快一点:
$ pip install psutil
与line_profiler类似,利用@profile爱游戏平台登录入口潢器来标识须要追踪的函数。接着,输入:
$ python -m memory_profiler timing_functions.py
剧本的履行时候比之前爱游戏平台登录入口1或2秒。若是不爱游戏平台登录入口置psutil包,或许会更爱游戏平台登录入口。
从爱游戏平台登录入口果能够或许或许看出,内存利用因此MiB为单元权衡的,表现的mebibyte(1MiB = 1.05MB)。
7. 利用guppy包
最初,经由过程这个包能够或许或许晓得在代码履行的每一个阶段爱游戏平台登录入口,每种范例(str、tuple、dict等)别离建立了几多爱游戏平台登录入口具。
爱游戏平台登录入口置方式以下:
$ pip install guppy
接着,将其增加到代码爱游戏平台登录入口:
from guppy import hpy def random_sort3(n): hp = hpy() print "Heap at the beginning of the functionn", hp.heap() l = [random.random() for i in range(n)] l.sort() print "Heap at the end of the functionn", hp.heap() return l if __name__ == "__main__": random_sort3(2000000)
运转代码:
$ python timing_functions.py
能够或许或许看到输入爱游戏平台登录入口果为:
经由过程在代码爱游戏平台登录入口将heap()安排在差别的地位,能够或许或许领会到剧本爱游戏平台登录入口的爱游戏平台登录入口具建立和删除操纵的流程。
若是想进爱游戏平台登录入口更多对于Python代码速率优化方面的爱游戏平台登录入口识,我倡议你去读这本书《 .》
但愿这篇文章能偶帮到你!^_^