• day19 生成器函数的好处


    一个简单的生成器函数
    import time
    def test():
        print('开始生成器')
        time.sleep(2)
        print('开始生成第1个。')
        yield '生成了第1个'
        time.sleep(3)
        print('开始生成第2个。。')
        yield '生成了第2个'
        time.sleep(3)
        print('开始生成第3个。。。')
        yield '生成了第3个'
    res=test()
    print(res)
    print(res.__next__())
    print(res.__next__())
    print(res.__next__())

    生成器函数的好处:

    1、节省内存,特别是大量数据的时候。比如我们生成一个列表:mylist = [1, 2, 3],也可以是mylist = [x**2 for x in range(3)],但是这样程序运行的时候,列表的数据全部存储在内存中,当数据量特别大的时候,会特别消耗内存。但是,利用生成器我们可以这样gen = (x ** 2 for x in range(4)),生成器只有在用的时候会生成,所以,当我们没有用到这个列表的时候它就不会存在,也不会占内存。

    如果有人不信可以试试这这两段代码:

     2、 节省代码,减少代码量同时提高代码可读性。请看下面两个函数,他们实现的功能是相同的,但是利用生成器代码量就会减少。

    3、 模拟并发。Python虽然支持多线程,但是由于GIL(全局解释锁,Global Interpreter Lock)的存在,同一个时间,只能有一个线程在运行,所以无法实现真正的并发。这时就出现了协程。复杂解释不说了,简单说协程就是你可以暂停执行的函数"。也就是yield。

    Python实现协程最简单的方法,就是使用yield。当一个函数在执行过程中被阻塞时,就用yield挂起,然后执行另一个函数。当阻塞结束后,可以用next()或者send()唤醒。相比多线程,协程的好处是它在一个线程内执行,避免线程之间切换带来的额外开销,而且协程不存在加锁的步骤。

    下面是一个生产者与消费者例子:

    通过执行结果,我们会看到控制台交替打印出生产和消费的结果。消费者consumer()函数是一个生成器函数,每次执行到yield时即挂起,并返回上一次的结果给生产者。生产者producer()接收到生成器的返回,并生成一个新的值,通过send()方法发送给消费者。至此,我们成功实现了一个(伪)并发。

    码字不易,多多关注,谢谢。不足之处欢迎指正。

  • 相关阅读:
    android button click事件
    springmvc 多方法访问
    hibernate的save和saveOrUpdate方法
    总结的方法
    oracle 存储过程
    ibatis学习笔记(四)>>>>>>>ibatis使用实例
    ibatis学习笔记(二)>>>>>>>sqlMapConfig.xml文件详解
    ibatis学习笔记(三)>>>>>>>java实体跟表映射.xml文件详解
    ibatis学习笔记(一)>>>>>>>sqlMapConfig.xml文件详解
    spring
  • 原文地址:https://www.cnblogs.com/douyunpeng/p/12699266.html
Copyright © 2020-2023  润新知