前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 代码检查,实现行级代码优化

python 代码检查,实现行级代码优化

作者头像
py3study
发布2020-01-09 01:02:18
5970
发布2020-01-09 01:02:18
举报
文章被收录于专栏:python3python3

    有时候运行一个python程序,它需要运行很长时间。你或许想提升该程序的运行效率。那该怎么做那?

     首先需要你要找到该程序瓶颈在哪里~   比如,哪个函数的运行花费时间比较长? 哪个函数占用内存比较多,是否需要优化对内存的使用? 哪个占用cpu时间比较长? 等...   这些都需要考虑,python有几个库可以帮助你解决这些问题~   废话不多说,切入主题。

首先写一段读取一个文件的python脚本:

代码语言:javascript
复制
touch c9.py

#!/usr/bin/env python
#Date: 2015/07/21

def read_file(fpath):
    BLOCK_SIZE=1024
    with open(fpath, 'rb') as fd:
        block = fd.read(BLOCK_SIZE)
        if block:
            yield block
        else:
            return

def main():
    for i in read_file('~/access.log')
        print i

if __name__ == "__main__":
    main()

 然后,对该代码进行测试。

首先测试该代码运行时间:

      它是一个外部的python测量。

wKiom1Wtq0WjGaA4AAEVu-Nf1Sc199.jpg
wKiom1Wtq0WjGaA4AAEVu-Nf1Sc199.jpg

real 表明了执行脚本花费的总时间。

user 表明了执行脚本花费在cpu的时间。

sys 表明了执行脚本花费在内核函数的时间。

因此, Real time和user+sys相加的不同或许表明了时间花费在等待i/o或者是系统在忙于执行其他任务。

使用cProfile模块

        如果想知道花费在每个函数和方法上的时间,以及他们被调用了多少次,你可以使用cProfile模块。

$ python -m cProfile -s cumulative  + 要执行的python脚本    ( -s cumulative 它将通过累积花费在每个函数上的时间来排序)

wKiom1Wtr_7SVO0dAAQLcFGOoa8346.jpg
wKiom1Wtr_7SVO0dAAQLcFGOoa8346.jpg

你将看到花费在运行你的脚本总时间是比以前高的,这是我们测量每个函数执行时间的损失。

使用line_profile模块

        line_profile 给出了在你代码美一行花费cpu时间。

        首先需要安装line_profiler:

                pip install line_profiler

接下来,你需要制定你想使用装饰器@profile评估哪个函数(你不需要把它import 到你的文件中)

wKiom1WtuhSCJLWTAAIfyDyspWo213.jpg
wKiom1WtuhSCJLWTAAIfyDyspWo213.jpg

接下来测试该代码:

        $ kernprof -l -v + 要执行的代码

wKiom1WtunGjlaE-AARCxdynI2o340.jpg
wKiom1WtunGjlaE-AARCxdynI2o340.jpg

        -l 标识表明了逐行和-v标识表明详细输出。

使用memory_profile模块

        memory_profile模块被用于在逐行的基础上,测量你代码的内存使用率。尽管如此,它可能使得你的代码运行的更慢。

        首先安装memory_profiler

                $pip install memory_profiler

         也建议安装psutil包,使得memory_profile模块运行的更快。

                 $ pip install psutil

类似于line_profile的方式,使用装饰器@profile来标记哪个函数被跟踪。

$python -m memory_profiler + 要执行的代码文件

wKioL1WtvmGiFjWaAAQImIsWaaQ189.jpg
wKioL1WtvmGiFjWaAAQImIsWaaQ189.jpg

看上面的输出,注意内存使用率的单位是MiB,这代表的是兆字节(1MiB = 1.05MB).

使用guppy模块

        使用guppy模块你可以跟踪每个类型在你代码中每个阶段(字符、元组、字典等等)有多少对象被创建。

安装guppy:

$ pip install guppy

然后将你的代码该改成如下:

代码语言:javascript
复制
#!/usr/bin/env python
from guppy import hpy

def read_file(fpath):
    hp = hpy()
    print "Heap at the beginning of the function\n", hp.heap()
    BLOCK_SIZE = 1024
    with open(fpath, 'rb') as fd:
        while True:
            block = fd.read(BLOCK_SIZE)
            if block:
                yield block
            else:
                print "Heap at the end of the function\n", hp.heap()
                return

def main():
    hp = hpy()
    print "Heap at the beginning of the function\n", hp.heap()
    for i in read_file('/Users/David/Applications/py/dt'):
        #print i
        pass
    print "Heap at the end of the function\n", hp.heap()

if __name__ == "__main__":
    main()

执行该代码:

$ python c9.py

wKioL1WtwlWC7D7qAAgVRIuUZSc843.jpg
wKioL1WtwlWC7D7qAAgVRIuUZSc843.jpg

通过数据结果,可以看出每个str、dict、function等对象被创建。

通过以上几个模块,可以更加清晰的了解python代码的执行过程以及对资源的占用情况。对代码优化有很大的帮助

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档