网易首页 > 网易号 > 正文 申请入驻

迭代器模式大幅提升Python性能

0
分享至

今天给大家介绍的设计模式非常简单,叫做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模式严格说起来其实只是迭代器的一种应用,它非常巧妙地将迭代器与匿名函数结合在一起,里面也没有太多的门道可以说,我们把刚才的代码改写一下,细节都在代码当中。

“`Python 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这个函数传入的参数,显然是不够合理的。

原文来自:http://www.yunweipai.com/39377.html
本文地址:https://www.linuxprobe.com/iterator-python.html
Linux命令大全:https://www.linuxcool.com/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
深夜12点!桑尼宣布,拿下中国第一个代言大单,点名称赞国足一哥

深夜12点!桑尼宣布,拿下中国第一个代言大单,点名称赞国足一哥

元爸体育
2024-06-16 16:04:46
刚向美国否认完“强迫劳动”,宁德时代就被曝要求员工896,奋斗100天

刚向美国否认完“强迫劳动”,宁德时代就被曝要求员工896,奋斗100天

小萝卜丝
2024-06-16 08:32:04
曾经的两个好朋友,已成两敌人,再想买先进装备是没地方可买了

曾经的两个好朋友,已成两敌人,再想买先进装备是没地方可买了

历史与财经
2024-06-12 12:52:02
土耳其宣布重大涉华消息,中国当即怒斥,美国笑了...

土耳其宣布重大涉华消息,中国当即怒斥,美国笑了...

新财迷
2024-06-17 10:32:07
他是蒋介石的贵人,70岁入党,儿子曾任上海市委书记,孙子是中将

他是蒋介石的贵人,70岁入党,儿子曾任上海市委书记,孙子是中将

历史1949
2024-06-14 00:06:04
河北最新平均工资公布!各市各行业……

河北最新平均工资公布!各市各行业……

纵览新闻
2024-06-17 10:30:08
哈里遗憾缺席国王生日庆典,梅根却无所谓,威廉当年一语成谶

哈里遗憾缺席国王生日庆典,梅根却无所谓,威廉当年一语成谶

译言
2024-06-17 12:08:58
太公平!姜萍老师:姜萍最高只能上到二本学院,还需要考试

太公平!姜萍老师:姜萍最高只能上到二本学院,还需要考试

解说阿洎
2024-06-16 23:42:44
微博之夜邓超被保安拖走,网友:超哥终于被强制下线了!

微博之夜邓超被保安拖走,网友:超哥终于被强制下线了!

娱记掌门
2024-06-16 23:30:46
白酒为什么不能冰镇之后喝?网友:在医院门口喝都赶不上趟

白酒为什么不能冰镇之后喝?网友:在医院门口喝都赶不上趟

奇特短尾矮袋鼠
2024-06-15 14:31:42
美洲杯球员身价前五:皇马占三席,维尼修斯1.8亿欧居首

美洲杯球员身价前五:皇马占三席,维尼修斯1.8亿欧居首

直播吧
2024-06-17 11:09:20
5月汽车品牌销量前40名都有谁?小米超奇瑞新能源居39

5月汽车品牌销量前40名都有谁?小米超奇瑞新能源居39

智车情报局
2024-06-17 11:24:13
警方通报“男子卧铺脱衣面对女乘客裸睡”:行拘5日

警方通报“男子卧铺脱衣面对女乘客裸睡”:行拘5日

极目新闻
2024-06-16 13:41:50
谣言不攻自破,姜萍能否被浙大录取?专家泼了一盆冷水

谣言不攻自破,姜萍能否被浙大录取?专家泼了一盆冷水

平老师666
2024-06-15 12:51:39
女模特私密视频意外泄露遭疯狂传播,本人崩溃痛哭,恳求不要观看

女模特私密视频意外泄露遭疯狂传播,本人崩溃痛哭,恳求不要观看

吃鱼思故渊
2024-05-17 22:00:37
教育部不批准福耀科技大学,却批准西湖大学,属实非常正确!

教育部不批准福耀科技大学,却批准西湖大学,属实非常正确!

咖啡店的老板娘
2024-06-13 21:17:16
河南64岁大爷五年间染指55名女性,只因太了解女性心理

河南64岁大爷五年间染指55名女性,只因太了解女性心理

真实故事汇
2024-05-06 13:31:30
随着许家印的没落,其女儿的生活也被曝光,奢侈程度令人咋舌

随着许家印的没落,其女儿的生活也被曝光,奢侈程度令人咋舌

天闻地知
2024-06-14 14:07:23
你知道为什么说“女性的私处”比马桶还要“脏”吗?

你知道为什么说“女性的私处”比马桶还要“脏”吗?

水白头
2024-06-15 11:07:02
库里:老詹是个轻松幽默的人 也许我们能在美国队中看到这种氛围

库里:老詹是个轻松幽默的人 也许我们能在美国队中看到这种氛围

直播吧
2024-06-17 12:02:09
2024-06-17 12:46:44
孙有匪
孙有匪
科技
1595文章数 2009关注度
往期回顾 全部

科技要闻

OpenAI可能会迎来重大变化

头条要闻

姜萍走红后有企业上门送5000元 老家门前将修水泥路

头条要闻

姜萍走红后有企业上门送5000元 老家门前将修水泥路

体育要闻

欧洲杯15亿豪阵险翻车:半场梦游 王牌打废

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

省市级税务人士:目前没有全国性查税

汽车要闻

传奇新篇章 全新一代大众迈腾来了

态度原创

时尚
本地
健康
数码
手机

夏季流行浅色系穿搭,这些技巧你要学会

本地新闻

能动司法尽“执”履责 ——“交叉执行”高效能

晚餐不吃or吃七分饱,哪种更减肥?

数码要闻

PC鲜辣报:英伟达RTX 50规格曝光 微软暂缓Win 11新预览版

手机要闻

一加冰川电池沟通会官宣!定档6月20日 锂电宁王助阵

无障碍浏览 进入关怀版