摘要:本篇博客简单讲解如何给Python程序做profile。profie很有用的,它可以分解程序各个部分花费了多少时间。
在linux下我用time这个命令可以查看程序运行的总时间,user mode时间和kernel mode时间。但是如果想更进一步,查看程序内部哪一行命令花费多少时间,或者查找程序的瓶颈部分,就得用 line_profiler 这个包了。这对于优化程序很有帮助。
官方安装方法:
pip install line_profiler
但是我用这个方法安装失败了。。。我是Anaconda环境,于是使用conda安装,成功了:
conda install line_profiler
分为三个步骤:
这里code.py 是要做profile的程序
代码:
import line_profiler
// ...
@profile
def findSubstring(self, s: str, words: List[str]) -> List[int]:
''' s -- O(N)
words -- O(M)
'''
from collections import defaultdict
if len(words) == 0 or len(s) == 0:
return []
answer = []
length = len(words[0])
s_pro = Solution.preprocess_s(s, length)
word_num = len(words)
word_dict = defaultdict(int)
for w in words:
word_dict[w] += 1
for i in range(0, len(s) - int(length*word_num) + 1):
words_tmp = Solution.get_words(s_pro, i, length, word_num)
if Solution.match_words(words_tmp, word_dict):
answer.append(i)
return answer
输出:
Line # Hits Time Per Hit % Time Line Contents
==============================================================
149 @profile
150 def findSubstring(self, s: str, words: List[str]) -> List[int]:
151 ''' s -- O(N)
152 words -- O(M)
153 '''
154 1 11.0 11.0 0.0 from collections import defaultdict
155
156 1 1.0 1.0 0.0 if len(words) == 0 or len(s) == 0:
157 return []
158
159 1 0.0 0.0 0.0 answer = []
160 1 1.0 1.0 0.0 length = len(words[0])
161 1 4376.0 4376.0 0.2 s_pro = Solution.preprocess_s(s, length)
162 1 0.0 0.0 0.0 word_num = len(words)
163 1 2.0 2.0 0.0 word_dict = defaultdict(int)
164 201 77.0 0.4 0.0 for w in words:
165 200 96.0 0.5 0.0 word_dict[w] += 1
166 9602 4482.0 0.5 0.2 for i in range(0, len(s) - int(length*word_num) + 1):
167 9601 1079034.0 112.4 52.4 words_tmp = Solution.get_words(s_pro, i, length, word_num)
168 9601 972198.0 101.3 47.2 if Solution.match_words(words_tmp, word_dict):
169 answer.append(i)
170 1 0.0 0.0 0.0 return answer
属性 | 解释 |
---|---|
line # | 行数 |
Hits | 这一行运行了多少次 |
Time | 在这一行上总共花费了多少时间 |
Per Hit | Time除以Hits |
% Time | 时间占比 |
Line Contents | 这一行的代码内容 |
可以看出,代码第167行时间占比是52.4%,第168行时间占比47.2%。
T h e E n d The\ End The End
喜 欢 记 得 点 赞 , 收 藏 , 甚 至 打 赏 哟 ~ 喜欢记得点赞,收藏,甚至打赏哟~ 喜欢记得点赞,收藏,甚至打赏哟~