最新要闻
- 【津云镜头】特警三支队、金街治安派出所做好爱警暖警工作
- 满满的回忆!赵雅芝吕良伟同台合唱《上海滩》 头条焦点
- 印度加入美国载人登月计划 被赞苏醒中的巨人:航天将远超俄罗斯
- 特斯拉天幕变全景烤炉 开车戴帽子冰袖 女子调侃自己变烤乳猪
- 这就是差距!AMD ROCm开发平台终于要支持RX 7900 XTX
- 蓉港高铁明天正式开行:成都10小时直达香港
- 收评:创业板指涨1.6% 复合集流体概念涨幅居前-焦点速讯
- 天热要注意!女子连吃两个超甜菠萝肝衰竭 医生称元凶可能是蜡样芽孢杆菌
- 上市公司回应给员工放暑假:放假情况属实 但个位数员工在岗不实
- 比盐粒还小的“LV”手提包卖出46.2万:用显微镜才能看清
- 从此告别毛巾了:芷雨加大洗脸巾13.9元200抽狂促
- 世界热讯:索尼第一方大作改编!电影《GT赛车:极速狂飙》官宣引进国内
- 今日讯!交易所协会再提积极服务低碳转型 绿色债券这三年发展有多快?
- 第一批实验室培育肉在美获准销售,人造肉市场发展风口何时来?
- 世界快报:流水线“造人”成真?科学家成功培养首个人类胚胎模型 全球哗然专家释疑
- 索尼称Xbox太有钱 能花50亿美元做3款独占《COD》
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
在python中实现使用迭代生成器yield减少内存占用的方法
在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中。其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会用到本文所介绍的迭代生成器yield。
(资料图片)
1.基本使用
首先我们用一个例子来演示一下迭代生成器yield的基本使用方法,这个例子的作用是构造一个函数用于生成一个平方数组$02,12,2^2...$。
在普通的场景中我们一般会直接构造一个空的列表,然后将每一个计算结果填充到列表中,最后return列表即可,对应的是这里的函数square_number。而另外一个函数square_number_yield则是为了演示yield而构造的函数,其使用语法跟return是一样的,不同的是每次只会返回一个值:
def square_number(length): s = [] for i in range(length): s.append(i ** 2) return s def square_number_yield(length): for i in range(length): yield i ** 2 if __name__ == "__main__": length = 10 sn1 = square_number(length) sn2 = square_number_yield(length) for i in range(length): print (sn1[i], "\t", end="") print (next(sn2))
在main函数中我们对比了两种方法执行的结果,打印在同一行上面,用end=""指令可以替代行末的换行符号,具体执行的结果如下所示:
[dechin@dechin-manjaro yield]$ python3 test_yield.py 0 01 14 49 916 1625 2536 3649 4964 6481 81
可以看到两种方法打印出来的结果是一样的。也许有些场景下就是需要持久化的存储函数中返回的结果,这一点用yield也是可以实现的,可以参考如下示例:
def square_number(length): s = [] for i in range(length): s.append(i ** 2) return s def square_number_yield(length): for i in range(length): yield i ** 2 if __name__ == "__main__": length = 10 sn1 = square_number(length) sn2 = square_number_yield(length) sn3 = list(square_number_yield(length)) for i in range(length): print (sn1[i], "\t", end="") print (next(sn2), "\t", end="") print (sn3[i])
这里使用的方法是直接将yield生成的对象转化成list格式,或者用sn3 = [i for i in square_number_yield(length)]
这种写法也是可以的,在性能上应该差异不大。
上述代码的执行结果如下:
[dechin@dechin-manjaro yield]$ python3 test_yield.py 0 0 01 1 14 4 49 9 916 16 1625 25 2536 36 3649 49 4964 64 6481 81 81
2.进阶测试
在前面的章节中我们提到,使用yield可以节省程序的内存占用,这里我们来测试一个100000大小的随机数组的平方和计算。如果使用正常的逻辑,那么写出来的程序就是如下所示
import tracemallocimport timeimport numpy as nptracemalloc.start() start_time = time.time()ss_list = np.random.randn(100000)s = 0for ss in ss_list: s += ss ** 2end_time = time.time()print ("Time cost is: {}s".format(end_time - start_time)) snapshot = tracemalloc.take_snapshot()top_stats = snapshot.statistics("lineno") for stat in top_stats[:5]: print (stat)
这个程序一方面通过time来测试执行的时间,另一方面利用tracemalloc追踪程序的内存变化。这里是先用np.random.randn()直接产生了100000个随机数的数组用于计算,那么自然在计算的过程中需要存储这些生成的随机数,就会占用这么多的内存空间。如果使用yield的方法,每次只产生一个用于计算的随机数,并且按照上一个章节中的用法,这个迭代生成的随机数也是可以转化为一个完整的list的:
import tracemallocimport timeimport numpy as nptracemalloc.start() start_time = time.time()def ss_list(length): for i in range(length): yield np.random.random() s = 0ss = ss_list(100000)for i in range(100000): s += next(ss) ** 2end_time = time.time()print ("Time cost is: {}s".format(end_time - start_time)) snapshot = tracemalloc.take_snapshot()top_stats = snapshot.statistics("lineno") for stat in top_stats[:5]: print (stat)
这两个示例的执行结果如下,可以放在一起进行对比:
[dechin@dechin-manjaro yield]$ python3 square_sum.py Time cost is: 0.24723434448242188ssquare_sum.py:9: size=781 KiB, count=2, average=391 KiBsquare_sum.py:12: size=24 B, count=1, average=24 Bsquare_sum.py:11: size=24 B, count=1, average=24 B[dechin@dechin-manjaro yield]$ python3 yield_square_sum.py Time cost is: 0.23023390769958496syield_square_sum.py:9: size=136 B, count=1, average=136 Byield_square_sum.py:14: size=112 B, count=1, average=112 Byield_square_sum.py:11: size=79 B, count=2, average=40 Byield_square_sum.py:10: size=76 B, count=2, average=38 Byield_square_sum.py:15: size=28 B, count=1, average=28 B
经过比较我们发现,两种方法的计算时间是几乎差不多的,但是在内存占用上yield有着明显的优势。当然,也许这个例子并不是非常的恰当,但是本文主要还是介绍yield的使用方法及其应用场景。
3.无限长迭代器
在参考链接1中提到了一种用法是无限长的迭代器,比如按顺序返回所有的素数,那么此时我们如果用return来返回所有的元素并存储到一个列表里面,就是一个非常不经济的办法,所以可以使用yield来迭代生成,参考链接1中的源代码如下所示:
"""学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!"""def get_primes(number): while True: if is_prime(number): yield number number += 1
那么类似的,这里我们用while True可以展示一个简单的案例——返回所有的偶数:
def yield_range2(i): while True: yield i i += 2 iter = yield_range2(0)for i in range(10): print (next(iter))
因为这里我们限制了长度是10,所以最终会返回10个偶数:
[dechin@dechin-manjaro yield]$ python3 yield_iter.py 024681012141618
4.总结
本文介绍了python的迭代器yield,其实关于yield,我们可以简单的将其理解为单个元素的return。这样不仅就初步理解了yield的使用语法,也能够大概了解到yield的优势,也就是在计算过程中每次只占用一个元素的内存,而不需要一直存储大量的元素在内存中。
关键词:
在python中实现使用迭代生成器yield减少内存占用的方法
文心一言 VS 讯飞星火 VS chatgpt (52)-- 算法导论6.2 4题_观焦点
使用Python字符串访问与修改局部变量_每日热议
热点在线丨狂收 3.2k star!百度开源压测工具,可模拟几十亿的并发场景,太强悍了!
【津云镜头】特警三支队、金街治安派出所做好爱警暖警工作
布局高端车载PHY芯片,加速推动高速以太网通信芯片国产化——访裕太微首席运营官李晓刚
科创板收盘播报:科创50指数涨0.37% 新股芯动联科较发行价涨75.21%
满满的回忆!赵雅芝吕良伟同台合唱《上海滩》 头条焦点
印度加入美国载人登月计划 被赞苏醒中的巨人:航天将远超俄罗斯
特斯拉天幕变全景烤炉 开车戴帽子冰袖 女子调侃自己变烤乳猪
这就是差距!AMD ROCm开发平台终于要支持RX 7900 XTX
蓉港高铁明天正式开行:成都10小时直达香港
收评:创业板指涨1.6% 复合集流体概念涨幅居前-焦点速讯
证监会公布第三批企业债注册批文 职责划转后核发募资超千亿元
天热要注意!女子连吃两个超甜菠萝肝衰竭 医生称元凶可能是蜡样芽孢杆菌
上市公司回应给员工放暑假:放假情况属实 但个位数员工在岗不实
比盐粒还小的“LV”手提包卖出46.2万:用显微镜才能看清
从此告别毛巾了:芷雨加大洗脸巾13.9元200抽狂促
世界热讯:索尼第一方大作改编!电影《GT赛车:极速狂飙》官宣引进国内
今日讯!交易所协会再提积极服务低碳转型 绿色债券这三年发展有多快?
「隐私计算黑客松」获奖代码全部开源!快去打卡~
当前资讯!干货|三个维度详解 Taier 本地调试原理和实践
通过 ChatGPT 提高你的创造力 焦点报道
天天微速讯:JetBrains系IDE使用Git很慢的问题
第一批实验室培育肉在美获准销售,人造肉市场发展风口何时来?
世界快报:流水线“造人”成真?科学家成功培养首个人类胚胎模型 全球哗然专家释疑
索尼称Xbox太有钱 能花50亿美元做3款独占《COD》
手握309亿利润却不分红 中芯国际:为股东长期利益考虑 滚动
大棕熊“下班”咣咣砸门急得直跳脚 绝不加班:网友直呼像极了打工人的我
盘点C#中感叹号"!"的作用_全球时讯
数码教程资讯:小米11青春版怎么设置24小时 全球聚看点
热热热!全国多地气温超40度 新能源车主如何经受“烤验”_环球头条
热文:炸串店老鼠啃食香肠被拍下 网友:主打一个明目张胆
315曝光假泰国香米公司被吊销:完全香精勾兑 和香米不沾边
何小鹏:和李斌、李想还在一个群里 但跟李斌聊得多些
上新了!小米平板6 Max首曝:12.4寸屏+10000mAh电池_环球关注
什么是 ChatGPT? 环球短讯
js中的解构赋值
Spring事件监听在业务使用中的优化
我国首个万吨级光伏制氢项目投产-环球今亮点
好作品应如实呈现时代的偏见吗?——《漫长的季节》中的女性角色塑造 焦点
【速看料】国产办公软件WPS出现服务故障 官微道歉:正在紧急排查修复
全球实时:红魔电竞平板官宣:首款骁龙8 Gen2+内置风扇平板
《博德之门3》反向跳票!不会为主机版质量向30帧妥协 全球快讯
你退了吗?网易暴雪国服游戏退款申请今天截止:过期视为自动放弃 全球快消息
男生长胖20斤被公司解约 官方回应:如举报会责令整改_当前短讯
每日播报!Linux 中重置数据库的 root 密码的技巧
海外视频直播源码技术视频直播间的搭建
BabylonJS教程_编程入门自学教程_菜鸟教程-免费教程分享|动态焦点
海康威视产品命名规则
焦点快看:记录一次项目数据采集分析-NEWC数据泄漏
微软只保证《使命召唤》停留三年 索尼官方回应
新资讯:携程正式宣布员工生孩后补贴5万元:每年1万 连领5年
超值优惠手慢无:真维斯Z+冰丝短裤29元、长裤/Polo衫39元
特斯拉充电中被临车女车主强行拔枪:哨兵模式拍个正着-焦点信息
你能坚持多久?小伙在没信号的原始森林隐居4年火了:中国最神秘部落揭秘_环球今热点
每日消息!特斯拉人形机器人将亮相上海:预计未来售价不超过15万元
IAM风险CTF挑战赛
PC网站如何实现微信扫码登录
【世界热闻】马价十倍说明了什么道理_马价十倍
【新视野】7月新规来了
我们该怎么帮助年轻人就业
2.5万元的Vision Pro问世 荣耀赵明:整个行业都应该感谢苹果_最新快讯
焦点资讯:帕萨特提车第二天就严重抖动 车主:车子像是仿佛在蹦
荣耀赵明:面对最强对手苹果竞争 荣耀整合核心能力突破
荣耀Magic V2即将发布 赵明:折叠屏将是未来最优解
贵州6人吃野生菌4人被送云南抢救:误食亚稀褶红菇、严重可致死
呼和浩特市:69处党政机关、企事业单位内部车场共享开放
一天吃透MySQL面试八股文 环球快资讯
央企的无奈:假央企何以屡禁不止?
每日快报!高温持续驻守华北黄淮等地 长江中下游降雨增强
游客自驾游开车压草场牧民损失数万 无视警示牌:官方回应
世界简讯:建全自主半导体产业链几乎不可能!ASML找强援:加速推进新一代光刻机
全球聚焦:频繁被黑!警惕抹黑清华的舆论倾向 网友支持:严惩造谣者
特斯拉Model 3一头扎进农田 只是因为捡一个瓶子 全球滚动
行政拘留能暂缓执行吗
【天天报资讯】险资:权益市场在底部区域 下半年看好科技和消费的投资价值
时代的眼泪!Kindle中国电子书店正式停运:这下真要盖泡面了-天天即时看
华为搞定6G赫兹技术验证:可实现10Gbps下行速率_世界速看
售价超28万!Caviar推出定制苹果Vision Pro:3斤18K黄金闪瞎眼 微资讯
栗新小学教师志愿服务队_关于栗新小学教师志愿服务队概略
天天通讯!读发布!设计与部署稳定的分布式系统(第2版)笔记16_握手和考验机
【环球新要闻】无糖可乐不能喝了?或含致癌物 厂商纷纷回应撇清关系
确保数字孪生水利管用好用_播资讯
小屏旗舰最后的荣光!华硕Zenfone 10图赏
国际饮料协会回应阿斯巴甜争议:系误导
双头男孩上下串联:被当畸形参观 死后还被盗尸解剖
无糖可乐或含致癌物?不能喝了?要不咱先把猪肉给戒了吧
全球热资讯!马云说阿里巴巴永远不会做快递!结果 还是真香
Epic喜+1:《纳赫鲁博王国地下城:混沌护符》!
开不了口周杰伦在线试听_开不了口周杰伦-世界观热点
今日看点:怒斥温网官方!安迪穆雷为自己鸣不平:我比阿尔卡拉斯伟大!
浙江省衢州市出现北斗智慧综合灯杆 实现全自动道路巡检
电影《封神第一部》妲己首次亮相 由新人演员娜然扮演
美团成功收购光年之外 收购价约为20.65亿人民币
市民称上海外滩夜景灯光太土 有一种浓浓的乡镇味道
科学家发现“孤雌生殖”的案例 哥斯达黎加一鳄鱼采用独特“繁殖”方式
国内首款抑郁症诊断机器人正式亮相 通过智能传输分析患者是否有抑郁症
全国首位视障播音硕士董丽娜毕业 其坚韧性格和不屈精神感动数万人
获取波场(Tron)钱包TRX、USDT余额和剩余带宽、能量 - 笔记 世界快播报