如何在Python函数执行前后增加额外的行为


Posted in Python onOctober 20, 2016

首先来看一个小程序,这个是计量所花费时间的程序,以下是以往的解决示例

from functools import wraps, partial
from time import time

def timing(func=None, frequencies=1):
 if func is None:
  # print("+None")
  return partial(timing, frequencies=frequencies)
 # else:
  # print("-None")

 @wraps(func)
 def _wrapper(*args, **kwargs):
  start_time = time()
  for t in range(frequencies):
   result = func(*args, **kwargs)
  end_time = time()
  print('运行花费时间:{:.6f}s。'.format(end_time-start_time))
  return result

 return _wrapper


@timing
def run():
 l = []
 for i in range(5000000):
  l.extend([i])
 return len(l)

运行如下:

In [4]: run()
运行花费时间:2.383398s。
Out[4]: 5000000

(喜欢刨根问底的可以去掉注释,并思考预计会有什么样的输出)。

今天无意间看到了Python的上下文管理器(Context Manager),发现也非常不错,其实这跟with语句是息息相关的,竟然以前一直未在意。

from time import time

def run2():
 l = []
 for i in range(5000000):
  l.extend([i])
 return len(l)

class ElapsedTime():
 def __enter__(self):
  self.start_time = time()
  return self

 def __exit__(self, exception_type, exception_value, traceback):
  self.end_time = time()
  print('运行花费时间:{:.6f}s。'.format(self.end_time - self.start_time))

with ElapsedTime():
 run2()

总结

初略看了一点官方文档,上下文管理还是有点多内容的。Python发展到现在,其实不简单了。说简单,只是你自己不够与时俱进,掌握的都是老式三板斧而已。所以,知识需要不断更新,才能弥补自己的盲点,以上就是本文的全部内容,希望能大家的学习或者工作带来一定的帮助。

Python 相关文章推荐
在Django的视图中使用数据库查询的方法
Jul 16 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
python递归下载文件夹下所有文件
Aug 31 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
python SOCKET编程基础入门
Feb 27 Python
如何利用Fabric自动化你的任务
Oct 20 #Python
windows下ipython的安装与使用详解
Oct 20 #Python
Python做文本按行去重的实现方法
Oct 19 #Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 #Python
python类中super()和__init__()的区别
Oct 18 #Python
Python 序列的方法总结
Oct 18 #Python
python 异常处理总结
Oct 18 #Python
You might like
层叠菜单的动态生成
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
弹出广告特效(一个IP只弹出一次)的代码
2007/07/27 Javascript
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
深入理解JavaScript的async/await
2018/08/05 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
利用Python进行异常值分析实例代码
2017/12/07 Python
python3+PyQt5使用数据库表视图
2018/04/24 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
python3 xpath和requests应用详解
2020/03/06 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
物流专业大学生的自我鉴定
2013/11/13 职场文书
公安领导班子四风问题个人整改措施思想汇报
2014/10/09 职场文书
荒岛余生观后感
2015/06/09 职场文书