最快的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

智能推荐

Qt打开文件夹选择文件、获取文件名、路径名、打开多个文件_vs+qt选择打开文件夹-程序员宅基地

文章浏览阅读9.6k次,点赞2次,收藏10次。在用Qt进行客户端开发时经常有打开目录选择文件的需求,本篇博客介绍Qt打开文件夹选择文件,获取文件名,获取文件路径,打开多个文件等方法。基本都是用QFileDialog类的方法,使用时需要包含头文件: #include <QFileDialog>1. 获取选择的文件夹路径 会用到..._vs+qt选择打开文件夹

【OpenCV 例程200篇】42. 图像的灰度变换(比特平面分层)_opencv bit-pane slicing-程序员宅基地

文章浏览阅读2.6k次,点赞9次,收藏13次。像素值也可以表示为二进制形式,对 8bits 二进制数的每一位进行切片,可以得到 8 个比特平面,称为比特平面分层(Bit-plane slicing)。高阶比特平面包含了大量有视觉意义的数据,而低阶比特平面包含了更精细的灰度细节。因此,比特平面分层可以用于图像压缩和图像重建。..._opencv bit-pane slicing

Linux CentOS 开启root用户远程登录_centos root远程登录-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏18次。Linux CentOS 开启root远程登录1、设置root密码2、开启root远程登录为了安全起见,root用户默认是没有密码的,且不许登录。1、设置root密码如果root未设置过密码,先以普通账号登录,然后输入以下命令来修改root密码:sudo passwd root2、开启root远程登录1)先以普通账号登录,然后输入以下命令来切换登录root:su2)修改ssh..._centos root远程登录

移动端适配方案_lib-flexible 华为适配问题-程序员宅基地

文章浏览阅读491次。移动端适配方案前言我认识的很多前端的初学者停留在PC端页面的阶段,但其实移动端开发也是非常重要的一个模块。而在移动端开发中最需要我们注意的,就是适配问题。这篇文章对完全没有接触过移动端开发的小伙伴也比较友好,我们从源头开始,让没有接触过移动端的小伙伴先有一个宏观上的认知,然后我们再细致的聊聊移动端适配的那些事儿(文章比较长,大家可以分阶段食用)。何为移动端开发大家最开始学习前端,一定是从PC端页面做起的,同样的道理,移动端无非就是把PC端的网页搬到手机上而已,通常我们把这样的项目叫做app(手动尴尬_lib-flexible 华为适配问题

Linux笔记-ubuntu16.04磁盘分区和挂载_ubuntu special device does not exist-程序员宅基地

文章浏览阅读4.1k次。1、检查磁盘和分区情况lsblk查看整体分区和磁盘情况fdisk -l能够查看到当前主机上已连接上的磁盘df -h能够查看到分区已经挂载的磁盘。2、磁盘分区、格式化:fdisk /dev/sdb根据帮助新建分区注意:最后输入w,保存更改并推出fdisk -l找到物理磁盘devvdb下创建的分区。mkfs.ext4 /dev/sdb2格式化上述找到的分区。3、挂载磁盘:mkdir /datamoun..._ubuntu special device does not exist

java的outputstream_java中outputStream与inputStream的相互转换-程序员宅基地

文章浏览阅读1.6k次。/*做一个功能验证,要用到inputStream与outputStream的转换,本以为很简单的东东搞了蛮久,从"程序员 闫帆"处取得一段代码*/package com.boco.test;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;impor..._outputstream转inputstream

随便推点

C/C++课程综合项目任务文档[2023-12-12]-程序员宅基地

文章浏览阅读387次,点赞9次,收藏9次。2、最后提交: 每周工作安排表、项目分析报告( word ) 以及系统程序代码要求将数据结构的定义、基本操作的原型声明及实现封装在相应.h 文件中,在源文件.cpp 中进行调用。2)查找: 用动态查找(如二又排序树、平衡二又树)或哈希查找,也可以折半+二又排序数、或哈希+二叉树排序树、哈希+折半等3)排序·快速排序二路归并排序,堆排序等。说明:不可以直接调用现有的类型、STL容器,用到的数据结构对应的数据类型要自己定义实现,利用平时课堂实验中已实现的拿来修改。线性结构:线性表、栈、队列(至少一种)

Android本地缓存getCacheDir()与getFilesDir(0_android getcachedir和getfilesdir-程序员宅基地

文章浏览阅读456次。1.getCacheDir()方法用于获取/data/data//cache目录2.getFilesDir()方法用于获取/data/data//files目录**应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的。大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中。这样当该应用被卸载后,这些数据还保留在SDCard中,留下了垃圾数_android getcachedir和getfilesdir

基于内容的推荐算法_内容推荐算法-程序员宅基地

文章浏览阅读4.1k次,点赞8次,收藏62次。文章目录什么是基于内容的推荐算法基于内容的推荐算法实现原理1. 基于用户和标的物特征为用户推荐的核心思想2. 构建用户特征表示3. 构建标的物特征表示(4)图片、音频、或者视频信息4. 为用户做个性化推荐(1)采用跟基于物品的协同过滤类似的方式推荐什么是基于内容的推荐算法首先我们给基于内容的推荐算法下一个定义,让读者有初步的印象,后面更容易理解我们讲的基于内容的推荐算法。所谓基于内容的推荐算法(Content-Based Recommendations)是基于标的物相关信息、用户相关信息及用户_内容推荐算法

kotlin函数的默认参数_kotlin默认参数-程序员宅基地

文章浏览阅读3.1k次。文章目录默认参数这里不介绍最基本的函数声明和调用默认参数和Java有着明显的不同官方文档函数参数可以有默认值,当省略相应的参数时使用默认值。与其他语言相比,这可以减少重载数量例子:可以看到,假设都有默认值,省略的是后面的默认参数,想省略前面的默认参数,需要指定参数。目前可以先理解为,省略默认参数的时候,也是从第一个参数开始匹配..._kotlin默认参数

Excel从txt导入文本并将空行删除_excel怎么转成txt文本空行-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏4次。Excel从txt导入文本并将空行删除前言一、从txt文件导入文本内容方法:例子:二、把导入的文本内容中的空行删除方法:例子总结前言经常会有数据保存成文本格式,但在数据处理的时候又习惯使用Excel进行处理。下面记录了如何导入文本数据以及,将不必要的空行删除。一、从txt文件导入文本内容方法:“数据”选项卡–>“获取数据”下拉菜单–>“自文件”–>“从文本/CSV”,然后选择需要导入的txt文件即可。从txt文件导入文本,txt中每一行会分别对应导入到Excel表格的各行中。_excel怎么转成txt文本空行

element-ui滚动组件关闭下拉菜单的问题总结_element下拉框禁止下拉-程序员宅基地

文章浏览阅读2.6k次。element-ui滚动组件关闭下拉菜单的问题一、问题说明目前前端项目中有一个现象是在一个弹窗或者页面中,滚动鼠标内容跟随滚动,打开的下拉菜单也跟随滚动,超出部分显示很不合理,测试同事提过相关问题的bug单,但因为时间问题只是修改了单个页面,这个问题属于全局性问题,所以这次把整改的思路整理一下:先看图二:描述问题由于下拉菜单包含(s-select-dropdown、s-time-pane1、s-picker-pane1、下拉菜单、自定义的下拉等),含有默认层级z-index,高出s-dialog的_element下拉框禁止下拉

推荐文章

热门文章

相关标签