zoukankan      html  css  js  c++  java
  • Python代码性能(时间+内存)

    Python代码性能(时间+内存)

    本文转载自https://blog.csdn.net/zong596568821xp/article/details/102454288


    背景

    在运行复杂的Python程序时,执行时间会很长,这时也许想提高程序的执行效率。但该怎么做呢?首先,要有个工具能够检测代码中的瓶颈,例如,找到哪一部分执行时间比较长。接着,就针对这一部分进行优化。同时,还需要控制内存和CPU的使用,这样可以在另一方面优化代码。本文主要介绍两种最常用的监控工具。

    时间分析

    line_profiler模块可以给出执行每行代码所需占用的CPU时间,首先,安装该模块:

    • pip安装
    $ pip install line_profiler
    

    or

    • 源码安装
    $ git clone https://github.com/rkern/line_profiler.git
    $ find line_profiler -name '*.pyx' -exec cython {} ;
    $ cd line_profiler
    $ pip install . --user
    
    • 示例
    
    import random 
    from line_profiler import LineProfiler
    from functools import wraps
     
    #查询接口中每行代码执行的时间
    def func_line_time(f):
        @wraps(f)
        def decorator(*args, **kwargs):
            func_return = f(*args, **kwargs)
            lp = LineProfiler()
            lp_wrap = lp(f)
            lp_wrap(*args, **kwargs) 
            lp.print_stats() 
            return func_return 
        return decorator 
     
    @func_line_time
    # 定义一个测试函数
    def random_sort2(n):
        l = [random.random() for i in range(n)]
        l.sort()
        return l
     
    if __name__ == "__main__":
        random_sort2(2000000)
    

    输出如下所示,各参数含义为

    Total Time:测试代码的总运行时间
    Line:代码行号
    Hits:表示每行代码运行的次数
    Time:每行代码运行的总时间
    Per Hits:每行代码运行一次的时间
    % Time:每行代码运行时间的百分比

    网上大多数方法是下边:

    1.在需要测试的函数前添加装饰器 @profile
    2.启动程序 $kernprof -l -v test.py

    这种方法无法正常运行原来的脚本,如果不用kernprof指令运行脚本时,还需注释掉@profile语句,不太方便,因此建议使用这里推荐的装饰器的方法。

    内存分析

    memory_profiler模块用来基于逐行测量代码的内存使用,安装方法如下:

    $ pip install memory_profiler psutil
    

    memory_profiler需要使用@profile装饰器来标识需要追踪的函数(即在函数前边加入@profile),就是上边一节后边提到的方法

    # 前边内容省略
     
    @profile
    # 定义一个测试函数
    def random_sort2(n):
        l = [random.random() for i in range(n)]
        l.sort()
        return l
     
    # 后边内容省略
    

    运行

    $ python -m memory_profiler test.py
    

    结果

    从结果可以看出,内存使用是以MiB为单位衡量的,表示的mebibyte(1MiB = 1.05MB)。

  • 相关阅读:
    java正则表达式
    SpringAOP03 项目脚手架、自定义注解、织入切面、引介增强
    SpringAOP02 自定义注解
    servlet01 项目demo、servlet生命周期
    SpringBoot15 sell02 订单模块
    SpringBoot15 sell01 项目创建、MySQL数据库连接、日志配置、开发热部署、商品信息模块
    datatables01 安装、数据源、选中行事件、新增一行数据、删除一行数据
    Navicat 连接阿里云的 MySQL
    linux内核中ip,tcp等头的定义(转)
    TCPflow:在Linux中分析和调试网络流量的利器(转)
  • 原文地址:https://www.cnblogs.com/nanmi/p/15099815.html
Copyright © 2011-2022 走看看