• 【无标题】


    Python循环优化技巧

    python开发中,循环代码很常见且不可避免,如何提高循环代码的质量,对我们开发有很大的帮助。
    编写循环时,遵守下面三个原则可以大大提高运行效率,避免不必要的低效计算:

    1.尽量使用局部变量代替全局变量。局部变量查询较快,便于维护,有利于提高性能并节省内存。
    2.尽量减少循环内部不必要的计算
    3…嵌套循环中,尽量减少内层循环的计算,尽可能把计算向外提

    下面我们用代码测试下减少内部循环计算,能够提升多少性能
    示例代码:

    # -*- coding: utf-8 -*-
    import datetime
    
    start_time = datetime.datetime.now()
    for i in range(10000):
        result_list = []
        for j in range(10000):
            result_list.append(i * 100 + j * 100)
    end_time = datetime.datetime.now()
    print u'计算耗时:{0}'.format((end_time - start_time).microseconds)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    实际运行耗时97500微秒:
    在这里插入图片描述优化之前运行程序耗时

    接下来我们稍微改一下代码,减少内部循环计算

    # -*- coding: utf-8 -*-
    import datetime
    
    start_time = datetime.datetime.now()
    for i in range(10000):
        result_list = []
        out_num = i * 100 # 放到第一个循环中计算
        for j in range(10000):
            result_list.append(out_num + j * 100)
    end_time = datetime.datetime.now()
    print u'计算耗时:{0}'.format((end_time - start_time).microseconds)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意这两部分代码的区别,我们只是将第二个循环内的计算放到了第二个新欢外边,我们再来看下此时的耗时732000微秒:
    在这里插入图片描述优化后耗时
    可以看到,性能提高大约25%左右,这只是用10000计算的,实际业务场景数据可能远远大于这个。

    巧妙使用yield

    关于yield定义我们就不在赘述了,直接上代码

    # -*- coding: utf-8 -*-
    # 使用yield
    import datetime
    start_time = datetime.datetime.now()
    def get_list_element():
        for i in range(1000000):
            temp = ['111111'] * 2000
            yield temp
    j = get_list_element()
    for ele in j:
        continue
    end_time = datetime.datetime.now()
    print u'计算耗时:{0}'.format((end_time - start_time).microseconds)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    # -*- coding: utf-8 -*-
    # 不使用yield
    import datetime
    
    start_time = datetime.datetime.now()
    test_list = []
    for i in range(1000000):
        temp = ['111111'] * 2000
        test_list.append(temp)
    for ele in test_list:
        continue
    end_time = datetime.datetime.now()
    print u'计算耗时:{0}'.format((end_time - start_time).microseconds)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    实际运行结果:
    在这里插入图片描述
    使用yield

    在这里插入图片描述不使用yield

    从测试结果中可以看出,在使用yield情况下,内存占用始终在30%左右,程序运行前后几乎不变,而且计算完后后耗时大约143000微秒。而不使用yield情况就不一样了。可以看到,程序运行的瞬间,内存直接拉满(电脑都卡的不要不要的),而且耗时也远远超于使用yield的情况。

    可以看到,巧妙的使用yield能节省巨大的时间、空间开销。

  • 相关阅读:
    Netty架构
    Web网页前端教程免费:引领您踏入编程的奇幻世界
    页面触底自动加载 Vue 组件
    魔兽世界安装插件后进游戏闪退的一个原因。
    ClickHouse 创建数据库建表视图字典 SQL
    @Controller和@RestController的区别
    【计算机毕设】基于SpringBoot的医院管理系统设计与实现 - 源码免费(私信领取)
    《社会学的邀请》
    求最大公约(因)数
    【HarmonyOS】元服务卡片展示动态数据,并定点更新卡片数据
  • 原文地址:https://blog.csdn.net/m0_46369686/article/details/125501213