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

你们好,咱们的git专题已经更新结束了,因此开始继续给你们写一点设计模式的内容。git

今天给你们介绍的设计模式很是简单,叫作iterator,也就是迭代器模式。迭代器是Python语言当中一个很是重要的内容,借助迭代器咱们能够很方便地实现不少复杂的功能。在深度学习当中,数据的获取每每也是经过迭代器实现的。所以这部分的内容很是重要,推荐你们必定要掌握。web

简单案例

在开始介绍设计模式以前,咱们先来看一个简单的需求。假设如今咱们须要根据传入的变量获取每周的前几天,好比说咱们传入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也是一个很大的数,咱们把这个函数改写成这样:app

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很大,对于内存的开销压力也很大,若是机器内存不够颇有可能致使崩溃。学习

那怎么解决呢?url

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

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

今天的文章就到这里,衷心祝愿你们天天都有所收获。若是还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发

相关文章
相关标签/搜索