学会迭代器设计模式,帮你大幅提升python性能


Posted in Python onJanuary 03, 2021

大家好,我们的git专题已经更新结束了,所以开始继续给大家写一点设计模式的内容。

今天给大家介绍的设计模式非常简单,叫做iterator,也就是迭代器模式。迭代器是Python语言当中一个非常重要的内容,借助迭代器我们可以很方便地实现很多复杂的功能。在深度学习当中,数据的获取往往也是通过迭代器实现的。因此这部分的内容非常重要,推荐大家一定要掌握。

简单案例

在开始介绍设计模式之前,我们先来看一个简单的需求。假设现在我们需要根据传入的变量获取每周的前几天,比如说我们传入3返回的就是[Mon, Tue, Wed],我们传入5返回[Mon, Tue, Wed, Thu, Fri]。这个需求大家应该都能理解,非常非常简单。

如果用一个函数来实现的话,就是这样:

def return_days(n):
    week = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
    return week[:n]

你看三行代码就实现了,在这个问题场景当中这样写当然是没有问题。但假如我们把题目稍微变一变,这里的week不是一个固定的数据,而是从上游或者是某个文件当中读取的。这里的n也是一个很大的数,我们把这个函数改写成这样:

def get_data(n):
    data = []
    for i in range(n):
        data.append(get_from_upstream())
    return data

我们假设get_from_upstream这个函数当中实现了获取数据的具体逻辑,那么上面这一段函数有一个什么问题?

有些同学会说这没有问题啊,因为像是其他语言实现数据获取的时候也都是这么干的。的确,像是Java等语言可能都是这么干的。但是其他语言这么干没错,不代表Python这么干也没错。因为我们没有把Python的能力发挥到最大。

这里有两个问题,第一个问题是延迟,因为前面说了,n是一个很大的数。我们从上游获取数据,无论是通过网络还是文件读取,本质上都是IO操作,IO操作的延迟是非常大的。那么我们把这n条数据全部搜集完可能需要很长的时间,导致下游的漫长等待。第二个问题就是内存,因为我们存储了这n条数据一起返回的,如果n很大,对于内存的开销压力也很大,如果机器内存不够很有可能导致崩溃。

那怎么解决呢?

其实解决的方法很简单,如果对迭代器熟悉的话,会发现迭代器针对的恰恰是这两个问题。我们把上面的逻辑改写成迭代器实现即可,这也就是iterator模式。

iterator模式

iterator模式严格说起来其实只是迭代器的一种应用,它非常巧妙地将迭代器与匿名函数结合在一起,里面也没有太多的门道可以说,我们把刚才的代码改写一下,细节都在代码当中。

def get_data(n):
    for i in range(n):
  yield get_from_upstream()


data_10 = lambda: get_data(10)
data_100 = lambda: get_data(100)

# use
for d in data_10:
    print(d)

很简单吧,但可能你要问了,我们既然写出了get_data这个迭代器,那么我们使用的时候直接for d in get_data(10)这样用不就好了,为什么中间要用匿名函数包一层呢?

道理也很简单,如果这个数据是我们自己使用,当然是没必要中间包一层的。但如果我们是传给下游使用的话,对于下游来说它肯定是不希望考虑上游太多的细节的,越简单越好。所以我们直接丢一个包装好的迭代器过去,下游直接call即可。否则的话,下游还需要感知get_data这个函数传入的参数,显然是不够合理的。

以上就是学会迭代器设计模式,帮你大幅提升python性能的详细内容,更多关于python 迭代器设计模式的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python 基础学习第二弹 类属性和实例属性
Aug 27 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
利用Python读取文件的四种不同方法比对
May 18 Python
virtualenv实现多个版本Python共存
Aug 21 Python
Python做智能家居温湿度报警系统
Sep 25 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
python从Oracle读取数据生成图表
Oct 14 Python
python 实现图片裁剪小工具
Feb 02 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 30 Python
Python编写万花尺图案实例
Jan 03 #Python
Python 实现一个简单的web服务器
Jan 03 #Python
关于Python错误重试方法总结
Jan 03 #Python
详解python中的异常和文件读写
Jan 03 #Python
python绘制雷达图实例讲解
Jan 03 #Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
Jan 01 #Python
python安装mysql的依赖包mysql-python操作
Jan 01 #Python
You might like
简体中文转换为繁体中文的PHP函数
2006/10/09 PHP
CI框架自动加载session出现报错的解决办法
2014/06/17 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
提高php编程效率技巧
2015/08/13 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
网页常用特效代码整理
2006/06/23 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
CSS3实现水平居中、垂直居中、水平垂直居中的实例代码
2020/02/27 HTML / CSS
艺术设计专业个人求职信
2013/09/21 职场文书
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
求职简历的自我评价
2014/01/31 职场文书
新春联欢会主持词
2014/03/24 职场文书
买房委托公证书
2014/04/08 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
办公室岗位职责范本
2015/04/11 职场文书
前台岗位职责范本
2015/04/16 职场文书
郭明义电影观后感
2015/06/08 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript