最快的java写法_Python循环12种超强写法,又快又省内存-程序员宅基地

技术标签: 最快的java写法  

f64def50297a8520b47bc20c8976b054.png

0 前言

说到处理循环,我们习惯使用for, while等,比如依次打印每个列表中的字符:

在打印内容字节数较小时,全部载入内存后,再打印,没有问题。可是,如果现在有成千上百万条车辆行驶轨迹,叫你分析出其中每个客户的出行规律,堵车情况等,假如是在单机上处理这件事。

你可能首先要面临,也可能被你忽视,最后代码都写好后,才可能暴露出的一个问题:outofmemory, 这在实际项目中经常遇到。

这个问题提醒我们,处理数据时,如何写出高效利用内存的程序,就显得很重要。今天,我们就来探讨如何高效利用内存,节省内存同时还能把事情办好。

其实,Python已经准备好一个模块专门用来处理这件事,它就是itertools 模块,这里面几个函数的功能其实很好理解。

我不打算笼统的介绍它们所能实现的功能,而是想分析这些功能背后的实现代码,它们如何做到高效节省内存的,Python内核的贡献者们又是如何写出一手漂亮的代码的,这很有趣,不是吗?

OK,let's go. Hope you enjoy the journey!

1 拼接元素

itertools 中的chain 函数实现元素拼接,原型如下,参数*表示个数可变的参数

chain(iterables)

应用如下:

哇,不能再好用了,它有点join的味道,但是比join强,它的重点在于参数都是可迭代的实例。

那么,chain如何实现高效节省内存的呢?chain大概的实现代码如下:

以上代码不难理解,chain本质返回一个生成器,所以它实际上是一次读入一个元素到内存,所以做到最高效地节省内存。

2 逐个累积

返回列表的累积汇总值,原型:

accumulate(iterable[, func, *, initial=None])

应用如下:

accumulate大概的实现代码如下:

以上代码,你还好吗?与chain简单的yield不同,此处稍微复杂一点,yield有点像return,所以 yield total那行直接就返回一个元素,也就是iterable的第一个元素,因为任何时候这个函数返回的第一个元素就是它的第一个。又因为yield返回的是一个generator对象,比如名字gen,所以next(gen)时,代码将会执行到 for element in it:这行,而此时的迭代器it 已经指到iterable的第二个元素,OK,相信你懂了!

3 漏斗筛选

它是compress 函数,功能类似于漏斗功能,所以我称它为漏斗筛选,原型:

compress(data, selectors)

容易看出,compress返回的元素个数等于两个参数中较短的列表长度。

它的大概实现代码:

这个函数非常好用

4 段位筛选

扫描列表,不满足条件处开始往后保留,原型如下:

dropwhile(predicate, iterable)

应用例子:

实现它的大概代码如下:

5 段位筛选2

扫描列表,只要满足条件就从可迭代对象中返回元素,直到不满足条件为止,原型如下:

takewhile(predicate, iterable)

应用例子:

实现它的大概代码如下:

6 次品筛选

扫描列表,只要不满足条件都保留,原型如下:

dropwhile(predicate, iterable)

应用例子:

实现它的大概代码如下:

7 切片筛选

Python中的普通切片操作,比如:

它们的缺陷还是lis 必须全部载入内存,所以更节省内存的操作islice,原型如下:

islice(iterable, start, stop[, step])

应用例子:

实现它的大概代码如下:

巧妙利用生成器迭代结束时会抛出异常StopIteration,做一些边界处理的事情。

8 细胞分裂

tee函数类似于我们熟知的细胞分裂,它能复制原迭代器n个,原型如下:

tee(iterable, n=2)

应用如下,可以看出复制出的两个迭代器是独立的

实现它的代码大概如下:

tee 实现内部使用一个队列类型deques,起初生成空队列,向复制出来的每个队列中添加元素newval, 同时yield 当前被调用的mydeque中的最左元素。

9 map变体

starmap可以看做是map的变体,它能更加节省内存,同时iterable的元素必须也为可迭代对象,原型如下:

starmap(function, iterable)

应用它:

starmap的实现细节如下:

10 复制元素

repeat实现复制元素n次,原型如下:

repeat(object[, times])

应用如下:

它的实现细节大概如下:

11 笛卡尔积

笛卡尔积实现的效果同下:

所以,笛卡尔积的实现效果如下:

它的实现细节:

12 加强版zip

组合值。若可迭代对象的长度未对齐,将根据 fillvalue 填充缺失值,注意:迭代持续到耗光最长的可迭代对象,效果如下:

它的实现细节:

它里面使用repeat,也就是在可迭代对象的长度未对齐时,根据 fillvalue 填充缺失值。理解上面代码的关键是迭代器对象(iter),next方法的特殊性:

结合这个提示再理解上面代码,就不会吃力。

【编辑推荐】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35696092/article/details/114705777

智能推荐

「360企业安全云」上线,免费护航中小微企业数字化建设_360企业安全云 销售许可证-程序员宅基地

文章浏览阅读4.6k次。3月1日,360集团推出“360企业安全云”,面向中小微企业免费提供企业级数字安全与管理解决方案,全面助力中小微企业数字化建设。行业人士表示,该产品的推广对资金、技术和人力有限的中小微企业无疑是一大利好。据360企业安全云负责人马博凯介绍,企业安全云是专注于企业级数字化安全与管理的SaaS套装,在360安全大脑的全面赋能下,面向中小微企业免费提供终端、网络、软件、数据、资产及防勒索等全方位安全与管理服务。官网信息显示,360企业安全云具有“云原生SaaS架构”、“企业级安全防护”和“定制级管理功_360企业安全云 销售许可证

使用virtualBox搭建一个linux完整版_virtualbox 搭建图形化linux-程序员宅基地

文章浏览阅读563次。1.新建2.填写虚拟机名称 此处因为搭建hadoop集群所以名称为node033.内存设置建议1G4.选择现在创建虚拟硬盘5.选择VDI6.动态分配7.如图8.创建好了虚拟机。9.设置此虚拟机此处注意选择桥接网络 这样建立的linux可以相互访问。此处选择镜像。10设置完成,后启动虚拟机11.选择对的镜像,点击启动12选择第一个,会从镜像安装linux系统注意:virtualBox点击虚拟机后,鼠标无法出来,点击ctrl键即可13 测试硬盘,选择跳过1_virtualbox 搭建图形化linux

大数据职业发展_大数据职业规划-程序员宅基地

文章浏览阅读447次,点赞2次,收藏2次。大数据传送门基础大数据职业发展方向传送门一线城市工资_大数据职业规划

(完美)华为Mate10 ALP-AL00的usb调试模式在哪里开启的方法_华为alp-al00找不到usb调试开关-程序员宅基地

文章浏览阅读6.4k次。当我们使用Pc接通安卓手机的时候,如果手机没有开启USB调试模式,Pc则无办法成功检测到我们的手机,在一些情况下,我们使用的一些功能较好的软件比如以前我们使用的一个软件引号精灵,老版本就需要开启USB调试模式下使用,现当新版本不需要了,如果遇到这个情况我们需要找方法将手机的USB调试模式开启,以下资料我们讲解华为Mate10 ALP-AL00如何开启USB调试模式的流程。首先,在华为Mate10..._华为alp-al00找不到usb调试开关

web前端期末大作业--HTML+CSS+JS实现美女拼图游戏,2024年最新2024年华为Web前端面试真题解析-程序员宅基地

文章浏览阅读829次,点赞13次,收藏16次。/游戏配置//生成规格横4 纵4//每个元素的间隔margin: 1,//拖动时候块透明度},id: “”,float: “”,width: “”,left: “”,top: “”,//元素生成参数},sortObj: {rightlist: [], //正确的排序romdlist: [] //打乱后的排序},//尺寸自动获取//计算单个div的高宽//图片生成div//创建一个素组并排序打散a++) {sid = 0;

Java代码实现SOAP和REST接口工具类_使用java实现soap接口调用的工具类-程序员宅基地

文章浏览阅读1.1k次。SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)是两种不同的Web服务通信协议,因此它们的接口工具类实现也有一些差异。需要注意的是,这些示例代码只实现了最基本的功能,实际使用时可能需要根据具体情况进行修改和扩展。同时还需要注意安全性和性能等方面的问题,例如SSL证书验证、连接池管理和结果缓存等。_使用java实现soap接口调用的工具类

随便推点

C语言:预处理_如何获取预编译的文件-程序员宅基地

这篇文章介绍了C语言中的预处理阶段,解释了编译器中的翻译环境和执行环境,以及如何通过预处理指令来避免重复引入头文件的问题。文章详细解释了预处理指令的作用。

Spring Boot入门(20):使用Mybatis-plus实现Spring Boot多数据源配置,轻松实现数据库读写分离!_spring boot 引入 mybatis plus 区分数据库嘛-程序员宅基地

文章浏览阅读1.8w次,点赞4次,收藏17次。如何实现多数据源的配置及项目使用,此文教会你,超级简单,开箱即用。_spring boot 引入 mybatis plus 区分数据库嘛

SAP message提示用法-程序员宅基地

文章浏览阅读2.1k次。SAP 的MESSAGE用法_sap message

结合邻域连接法的蚁群优化(NACO)求解TSP问题(Matlab代码实现)_可变邻域下降算法tsp matlab-程序员宅基地

文章浏览阅读245次。新算法高度关注所有可能影响解决方案的标准并将其应用于 TSP,并且通过将它们与蚁群的原始算法进行比较,特别是在减少计算和时间方面,它对解决方案进行了许多改进。因此,它在更少的时间和空间内给出解决方案,并在近似解决方案足以解决问题的情况下使用,特别是在达到确切解决方案非常困难的情况下。本文的第一个目的是强调每种TSP方法的要求,局限性和功能,以指导科学家和研究人员选择最适合其特定需求的方法。它对最有效和广泛使用的TSP方法进行了全面调查,通过研究旨在发现其优势和劣势的方法来澄清其主要差异。_可变邻域下降算法tsp matlab

精选了20个Python实战项目(附源码),拿走就用!零基础练手不二项目!_python项目-程序员宅基地

文章浏览阅读1.1w次,点赞9次,收藏49次。Python是目前最好的编程语言之一。由于其可读性和对初学者的友好性,已被广泛使用。_python项目

有什么优质的计算机专业书籍?操作系统、计算机网络、计算机组成、数据结构、数据库....._数据结构操作系统计算机网络推荐书籍-程序员宅基地

文章浏览阅读4.6w次,点赞2.3k次,收藏2.9k次。大家好,我是小林哥。平日里,大家都喊程序员加班多很辛苦,动不动就掉头发,但干的还是很香的,毕竟大多数公司钱还是给的很到位的,今年毕业应届生的我见到好多动不动就月薪 20K~30K 的,真让人两眼泪酸酸,当然这离不开他们大学期间的努力。讲真,没什么家庭背景的人,选择当程序员确实是比较好的选择了,原因有二:首先,当今互联网、AI 人工智能、大数据等都是高速发展的行业,自然人才需求很多,薪资也相对其他传统行业高;第二,纯粹看你技术能力,只要自己愿意付出努力,技术能力肯定会慢慢提高上来,而且现在比起几十年_数据结构操作系统计算机网络推荐书籍

推荐文章

热门文章

相关标签