【无标题】

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)

实际运行耗时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)

注意这两部分代码的区别,我们只是将第二个循环内的计算放到了第二个新欢外边,我们再来看下此时的耗时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)
# -*- 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)

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值