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

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

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

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

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测量。

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

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

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

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

使用cProfile模块

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

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

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

使用line_profile模块

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

首先需要安装line_profiler:

pip install line_profiler

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

接下来测试该代码:

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

-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 + 要执行的代码文件

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

使用guppy模块

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

安装guppy:

$ pip install guppy

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

#!/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

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

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

时间: 2024-10-11 01:51:33

python 代码检查,实现行级代码优化的相关文章

python代码检查工具pylint 让你的python更规范

1.pylint是什么? Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码.目前 Pylint 的最新版本是 pylint-0.18.1. Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等. Pylint 的一个很大的好

40多行python代码开发一个区块链。

40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为区块链目前还是不成熟的解决方案,但它无疑是计算机发展史上的一个奇迹.但是,到底区块链是什么呢? 区块链 区块链是一个公开的数字账本,它按时间顺序记录比特币或其他加密货币发生的交易. 更一般的讲,区块链是一个公共数据库,新的数据将存储在一个被称为"块"的容器中,然后块会被添加到一个不可篡改的

10 行 Python 代码实现模糊查询/智能提示

10 行 Python 代码实现模糊查询/智能提示 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列表供用户选择. 样例如下: Vim (Ctrl-P) Sublime Text (Cmd-P) '模糊匹配'这是一个极为有用的特性,同时也非常易于实现. 2.问题分析: 我们有一堆字符串(文件名)集合,我们根据用户的输入不断进行过滤,用户的输入可能是字符串的一部分.我们就以下面的

200行Python代码实现2048

200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器 3. 环境使用 使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操

基于Tkinter用50行Python代码实现简易计算器

Tkinter一般是python自带的,所以代码不需要其他组件,本程序是在python2.7版本实现的. 主要涉及了tkinter的使用,函数定义和调用,匿名函数的使用,类成员函数定义等python基础知识,适合新手学习. 代码如下: from Tkinter import * #创建横条型框架 def frame(root, side): w = Frame(root) w.pack(side = side, expand = YES, fill = BOTH) return w #创建按钮

一个 11 行 Python 代码实现的神经网络

概要:直接上代码是最有效的学习方式.这篇教程通过由一段简短的 python 代码实现的非常简单的实例来讲解 BP 反向传播算法. 代码如下: Python 1 2 3 4 5 6 7 8 9 10 11 X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ]) y = np.array([[0,1,1,0]]).T syn0 = 2*np.random.random((3,4)) - 1 syn1 = 2*np.random.random((4,1))

一起来写2048(160行python代码)

前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家,而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到2048,两周后决赛再次遇到2048,后来五月份的广东省赛,又出现了2048.在这三次比赛过程中,我一次2048都没玩过..全靠队友的解释,直到昨天,我突然想起写个2048吧,于是下了个2048玩了几盘,之后就開始用python来写了,心想就不写界面了,为了简洁. 我对python并不熟悉,可是我在之前

10行python代码实现约瑟夫问题

什么是约瑟夫问题? 约瑟夫问题是一个有趣的数学游戏,游戏规则如下: 1.N个人围成一个圈,编号从1开始,依次到N. 2.编号为M的游戏参与者开始报数,报数从1开始,后面的人报数接龙,直到K为止,报数为K的人将出局. 3.出局者的下一个玩家接着从1开始报数,如此循环,直到剩下一个玩家时游戏结束,这个玩家就是游戏获胜者. 那么问题来了,哪个编号是游戏获胜者呢? 下面通过简单的几行python代码来解决这个问题: #!/usr/bin/env python # Joseph Problem def j

vim中注释多行python代码

在vim中注释多行python代码比较麻烦,主要由以下几种方法: (1)将需要注释的代码以文档字符串的形式呈现 (2)将需要注释的代码以函数的形式呈现 (3)使用vim自身快捷键 我们主要使用第三种方式,下面是注释和取消注释的方法. 1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式; 2. 在行首使用上下键选择需要注释的多行; 3. 按下键盘(大写)"I"键,进入插入模式: 4. 然后输入注释符("//"."