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 相关文章推荐
一个小示例告诉你Python语言的优雅之处
Jul 04 Python
python生成IP段的方法
Jul 07 Python
Python 对象中的数据类型
May 13 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
Python之str操作方法(详解)
Jun 19 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
Django2.1.3 中间件使用详解
Nov 26 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
利用python中集合的唯一性实现去重
Feb 11 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
基于python的opencv图像处理实现对斑马线的检测示例
Nov 29 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 smarty函数扩展
2010/03/15 PHP
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
2015/10/01 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
Python中分支语句与循环语句实例详解
2018/09/13 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
jupyter notebook 重装教程
2020/04/16 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
交通安全标语
2014/06/06 职场文书
运动会宣传口号
2014/06/09 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
检讨书范文2000字
2015/01/28 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers