美文网首页
[OpenCV官方教程中文版-段力辉译]-用line_profi

[OpenCV官方教程中文版-段力辉译]-用line_profi

作者: 六千宛 | 来源:发表于2021-06-17 11:20 被阅读0次

    1 line_profiler

    在linux下我用time这个命令可以查看程序运行的总时间,user mode时间和kernel mode时间。但是如果想更进一步,查看程序内部哪一行命令花费多少时间,或者查找程序的瓶颈部分,就得用 line_profiler 这个包了。这对于优化程序很有帮助。

    1.1 安装

    官方安装方法:

    pip install line_profiler
    

    但是我用这个方法安装失败了。。。我是Anaconda环境,于是使用conda安装,成功了:

    conda install line_profiler
    

    2 使用

    分为三个步骤:

    • import line_profiler
    • 给函数加上 @profile 这个装饰器
    • 在命令行里面输入 kernprof -v -l code.py

    这里code.py 是要做profile的程序

    3 Talk is cheap, show me the code.

    代码:

        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
    
    image.png

    4 讨论

    • 使用line_profiler会使程序运行变慢,时间大约翻倍。但是没关系,line_profiler的的核心目的是找到程序的瓶颈部分,也就是时间占比 %Time。如果每一行都变慢一样的比例的话,不影响时间占比。
    • line_profiler不支持多进程,如果程序中使用了 joblib 或者 subprocess 的话,就不能用 line_profiler。
    • line_profiler这个包是一个叫做Robert Kern的大牛写的,所以命令叫做kernprof。
    • cProfile 也可以做profile。我不常使用这个包,因为我不喜欢这个包的输出结果。line_profiler可以输出每行的时间,这个我喜欢。
    • 上述都是对时间做profile。对内存做profile呢?使用这个包:memory-profiler

    相关文章

      网友评论

          本文标题:[OpenCV官方教程中文版-段力辉译]-用line_profi

          本文链接:https://www.haomeiwen.com/subject/sntcyltx.html