学会迭代器设计模式,帮你大幅提升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之集合(set)
Sep 24 Python
django批量导入xml数据
Oct 16 Python
Python简单的制作图片验证码实例
May 31 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
python检测IP地址变化并触发事件
Dec 26 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
Win10+GPU版Pytorch1.1安装的安装步骤
Sep 27 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
pytorch SENet实现案例
Jun 24 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
python数据分析之用sklearn预测糖尿病
Apr 22 Python
python的html标准库
Apr 29 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
python获取mp3文件信息的方法
2015/06/15 Python
python 写的一个爬虫程序源码
2016/02/28 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
python @classmethod 的使用场合详解
2019/08/23 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
村抢险救灾方案
2014/05/09 职场文书
星级党支部申报材料
2014/05/31 职场文书
企业员工爱岗敬业演讲稿
2014/08/26 职场文书
财务工作检讨书
2014/10/29 职场文书
2014年基建工作总结
2014/12/12 职场文书
涨价通知
2015/04/23 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
导游词之无锡东林书院
2019/12/11 职场文书