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

 更新时间:2021年01月03日 11:50:15   作者:TechFlow2019  
这篇文章主要介绍了python 迭代器设计模式的相关资料,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下

大家好,我们的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 Tkinter Canvas画布控件详解

    Python Tkinter Canvas画布控件详解

    Canvas 控件具有两个功能,首先它可以用来绘制各种图形,比如弧形、线条、椭圆形、多边形和矩形等,其次 Canvas 控件还可以用来展示图片。本文将具体介绍一直Tkinter中的画布控件,需要的可以参考一下
    2022-01-01
  • Python中XML转JSON、XML转字典代码示例

    Python中XML转JSON、XML转字典代码示例

    大家都知道python的字典和json类似,那么可不可以先将xml转换成json再去做其他的事情呢,下面这篇文章主要给大家介绍了关于Python中XML转JSON、XML转字典的相关资料,需要的朋友可以参考下
    2024-02-02
  • Python命名空间详解

    Python命名空间详解

    这篇文章主要介绍了Python命名空间详解,非常重要的概念,需要的朋友可以参考下
    2014-08-08
  • 利用python批量给云主机配置安全组的方法教程

    利用python批量给云主机配置安全组的方法教程

    这篇文章主要给大家介绍了利用python批量给云主机配置安全组的方法教程,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • pyqt5使用按钮进行界面的跳转方法

    pyqt5使用按钮进行界面的跳转方法

    今天小编就为大家分享一篇pyqt5使用按钮进行界面的跳转方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • centos7之Python3.74安装教程

    centos7之Python3.74安装教程

    这篇文章主要介绍了centos7之Python3.74安装教程,本文给大家介绍的非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-08-08
  • python 时间处理之月份加减问题

    python 时间处理之月份加减问题

    这篇文章主要介绍了python 时间处理之月份加减问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Python K最近邻从原理到实现的方法

    Python K最近邻从原理到实现的方法

    这篇文章主要介绍了Python K最近邻从原理到实现的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python语法 之与用户交互和运算符

    python语法 之与用户交互和运算符

    这篇文章主要介绍了python语法 之与用户交互和运算符,用户交互就是人往计算机中input/输入数据,计算机print/输出结果,下文更多相关内容需要的朋友可以参考一下
    2022-04-04
  • django-rest-framework解析请求参数过程详解

    django-rest-framework解析请求参数过程详解

    这篇文章主要介绍了django-rest-framework解析请求参数过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论