python一些性能分析的技巧


Posted in Python onAugust 30, 2020

当我们开始精通编程语言时,我们不仅希望实现最终目标,而且希望使我们的程序高效。

在这个教程中,我们将学习一些Ipython的命令,这些命令可以帮助我们对Python代码进行时间分析。

注意,在本教程中,我建议使用Anaconda。

1.分析一行代码

要检查一行python代码的执行时间,请使用 %timeit 。下面是一个简单的例子来了解它的工作原理:

#### magics命令%timeit的简单用法
%timeit [num for num in range(20)]

#### 输出
1.08 µs ± 43 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

主要注意事项:

  • 在要分析的代码行之前使用%timeit
  • 它返回代码运行的平均值和标准偏差。在上面的示例中,执行了7次,每次执行对该代码循环100万次(默认行为)。这需要平均1.08微秒和43纳秒的标准偏差。
  • 在调用magic命令时,可以自定义运行和循环的数量。示例如下:
#### 在%timeit magic命令中自定义运行和循环数
%timeit -r5 -n100 [num for num in range(20)]

1.01 µs ± 5.75 ns per loop (mean ± std. dev. of 5 runs, 100 loops each)

使用命令选项-r和-n,分别表示执行次数和循环次数,我们将时间配置文件操作定制为执行5次和循环100次。

2.分析多行代码

本节向前迈进了一步,并解释了如何分析完整的代码块。通过对%timeit magic命令进行一个小的修改,将单百分比(%)替换为双百分比(%%),就可以分析一个完整的代码块。以下为示例演示,供参考:

#### 使用timeblock%%代码分析
%%timeit -r5 -n1000
for i in range(10):
  n = i**2
  m = i**3
  o = abs(i)
  
#### 输出
10.5 µs ± 226 ns per loop (mean ± std. dev. of 5 runs, 1000 loops each)

可以观察到for循环的平均执行时间为10.5微秒。请注意,命令选项-r和-n分别用于控制执行次数和循环次数。

3.代码块中的每一行代码进行时间分析

到目前为止,我们只在分析一行代码或代码块时查看摘要统计信息。如果我们想评估代码块中每一行代码的性能呢?使用 Line_profiler 。

Line_profiler包可用于对任何函数执行逐行分析。要使用line_profiler软件包,请执行以下步骤:

安装— Line_profiler 包可以通过简单的调用pip或conda Install来安装。如果使用的是针对Python的anaconda发行版,建议使用conda安装

#### 安装line_profiler软件包
conda install line_profiler

加载扩展—一旦安装,你可以使用IPython来加载line_profiler:

#### 加载line_profiler的Ipython扩展
%load_ext line_profiler

时间分析函数—加载后,使用以下语法对任何预定义函数进行时间分析

%lprun -f function_name_only function_call_with_arguments

语法细节:

  • 对line_profiler的调用以关键字%lprun开始,后跟命令选项-f
  • 命令选项之后是函数名,然后是函数调用

在本练习中,我们将定义一个接受高度(以米为单位)和重量(以磅为单位)列表的函数,并将其分别转换为厘米和千克。

#### 定义函数
def conversion(ht_mtrs, wt_lbs ):
  ht_cms = [ht*100 for ht in ht_mtrs]
  wt_kgs = [wt*.4535 for wt in wt_lbs]
  
#### 定义高度和重量列表:
ht = [5,5,4,7,6]
wt = [108, 120, 110, 98]

#### 使用line_profiler分析函数
%lprun -f conversion conversion(ht,wt)

---------------------------------------------------------------
#### 输出
Total time: 1.46e-05 s

File: <ipython-input-13-41e195af43a9>

Function: conversion at line 2

Line #   Hits     Time Per Hit  % Time Line Contents
==============================================================
   2    1    105.0  105.0   71.9   ht_cms = [ht*100 for ht in ht_mtrs]
   3    1     41.0   41.0   28.1   wt_kgs = [wt*.4535 for wt in wt_lbs]

输出详细信息:

以14.6微秒为单位(参考第一行输出)

生成的表有6列:

  • 第1列(行#)—代码的行号(请注意,第#1行是故意从输出中省略的,因为它只是函数定义语句)
  • 第2列(命中)—调用该行的次数
  • 第3列(时间)—在代码行上花费的时间单位数(每个时间单位为14.6微秒)
  • 第4列(每次命中平均时间)—第3列除以第2列
  • 第5列(%Time)—在所花费的总时间中,花在特定代码行上的时间百分比是多少
  • 第6列(内容)—代码行的内容

你可以清楚地注意到,高度从米到厘米的转换几乎占了总时间的72%。

结束语

利用每一行代码的执行时间,我们可以部署策略来提高代码的效率。在接下来的3个教程中,我们将分享一些最佳实践来帮助你提高代码的效率。

我希望这篇教程能提供帮助,你能学到一些新东西。

以上就是python一些性能分析的技巧的详细内容,更多关于python 性能分析的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
python实现自动登录
Sep 17 Python
python+splinter自动刷新抢票功能
Sep 25 Python
简单了解django索引的相关知识
Jul 17 Python
python实现网站微信登录的示例代码
Sep 18 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
Python类型转换的魔术方法详解
Dec 23 Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
python脚本第一行如何写
Aug 30 #Python
golang/python实现归并排序实例代码
Aug 30 #Python
python创建文本文件的简单方法
Aug 30 #Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 #Python
Python Map 函数的使用
Aug 28 #Python
python实现单机五子棋
Aug 28 #Python
Python3+selenium配置常见报错解决方案
Aug 28 #Python
You might like
php学习之 认清变量的作用范围
2010/01/26 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
php生成短域名函数
2015/03/23 PHP
PHP连接access数据库
2015/03/27 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
javascript 写类方式之八
2009/07/05 Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
python3制作捧腹网段子页爬虫
2017/02/12 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
python实现狄克斯特拉算法
2019/01/17 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
优秀求职信范文分享
2014/01/26 职场文书
合作意向书范本
2014/03/31 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
教师考察材料范文
2014/06/03 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
表扬稿格式范文
2015/01/16 职场文书
喋血孤城观后感
2015/06/08 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python