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

开发 后端
今天给大家介绍的设计模式非常简单,叫做iterator,也就是 迭代器模式 。

 [[373430]]

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

简单案例

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

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

  1. def return_days(n): 
  2.     week = ['Mon''Tue''Wed''Thu''Fri''Sat''Sun'
  3.     return week[:n] 

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

  1. def get_data(n): 
  2.     data = [] 
  3.     for i in range(n): 
  4.         data.append(get_from_upstream()) 
  5.     return data 

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

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

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

那怎么解决呢?

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

iterator模式

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

  1. def get_data(n): 
  2.     for i in range(n): 
  3.   yield get_from_upstream() 
  4.  
  5.  
  6. data_10 = lambda: get_data(10
  7. data_100 = lambda: get_data(100
  8.  
  9. # use 
  10. for d in data_10: 
  11.     print(d) 

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

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

责任编辑:张燕妮 来源: 博客园
相关推荐

2023-04-10 09:15:25

Vite 4.3SWC 插件

2021-06-22 15:27:13

设计模式迭代器模式Java

2020-11-06 09:01:46

迭代器模式

2010-04-29 08:53:11

PHP迭代器模式

2023-11-09 08:46:24

2012-10-16 14:00:08

猎豹浏览器

2024-06-04 00:00:01

微软EdgeReact

2023-11-26 09:04:10

Vue性能

2024-04-29 18:55:16

缓存Spring性能

2022-03-29 07:52:07

设计模式单例设计模式java

2024-08-19 00:05:25

2014-05-28 14:10:11

CrossApp

2023-05-25 20:06:17

Linux游戏性能

2023-06-12 00:36:28

迭代向量化Pandas

2009-04-27 16:27:49

LinuxKernel 2.6.Intel

2010-01-21 23:29:06

戴尔银行东亚银行

2009-12-10 09:23:13

ASP.NET开发

2023-12-13 13:28:16

装饰器模式Python设计模式

2016-03-28 10:39:05

Python迭代迭代器

2009-08-26 16:26:37

C#迭代器模式
点赞
收藏

51CTO技术栈公众号