首页 / 知识
关于python:生成器表达式与列表理解
2023-04-14 10:42:00

Generator Expressions vs. List Comprehension什么时候应该使用生成器表达式,什么时候应该在Python中使用列表理解?
约翰的回答是好的(当你想重复几次某件事情时,列表的理解更好)。但是,也值得注意的是,如果您想使用任何列表方法,就应该使用列表。例如,以下代码不起作用:
基本上,如果您所做的只是迭代一次,那么使用生成器表达式。如果您想存储和使用生成的结果,那么您最好能理解列表。 由于性能是选择一个而不是另一个的最常见原因,我的建议是不要担心它,只选择一个;如果您发现您的程序运行太慢,那么,只有在那时,您才应该回去考虑调整您的代码。 迭代生成器表达式或列表理解也会做同样的事情。但是,列表理解将首先在内存中创建整个列表,而生成器表达式将动态创建这些项,因此您可以将其用于非常大的(也是无限的!)序列。 当结果需要重复多次或速度最重要时,使用列表理解。在范围较大或无穷大的地方使用生成器表达式。 重要的是列表理解创建了一个新的列表。生成器创建一个不可重复的对象,当您使用位时,该对象将动态"过滤"源材料。 假设您有一个名为"hugefile.txt"的2tb日志文件,并且您想要所有以单词"entry"开头的行的内容和长度。 所以你试着从写清单开始理解:
这会吞食整个文件,处理每一行,并将匹配的行存储在数组中。因此,此数组最多可以包含2tb的内容。这是一个很大的RAM,可能不适合您的目的。 因此,我们可以使用生成器对内容应用"过滤器"。在开始对结果进行迭代之前,实际上不会读取任何数据。
还没有从我们的文件中读取任何一行。事实上,假设我们想要进一步过滤我们的结果:
仍然没有任何内容被读取,但是我们现在指定了两个生成器,它们将根据我们的需要对我们的数据进行操作。 让我们把过滤后的行写到另一个文件:
现在我们读取输入文件。由于我们的 因此,您没有以完全填充的列表的形式将数据"推送"到输出函数,而是为输出函数提供了一种仅在需要时"拉"数据的方法。这在我们的情况下效率更高,但没有那么灵活。生成器是单向的,一次通过;我们读取的日志文件中的数据会立即被丢弃,因此我们无法返回到前一行。另一方面,我们不必担心一旦完成了数据的保存。 生成器表达式的好处是它使用较少的内存,因为它不会一次构建整个列表。当列表是一个中介时,例如求和结果或从结果中创建dict时,最好使用生成器表达式。 例如:
它的优点是列表没有完全生成,因此使用的内存很少(而且应该更快)。 但是,当所需的最终产品是列表时,您应该使用列表理解。您不会使用生成器表达式保存任何内存,因为您需要生成的列表。您还可以使用任何列表功能,如排序或反转。 例如:
从可变对象(如列表)创建生成器时,请注意生成器将在使用生成器时(而不是在创建生成器时)根据列表的状态进行评估:
如果您的列表有可能被修改(或者列表中的可变对象),但是您需要在创建生成器时的状态,那么您需要使用列表理解。 我正在使用Hadoop肉末模块。我认为这是一个很好的例子:
在这里,生成器从文本文件中获取数字(大到15GB),并使用Hadoop的map reduce对这些数字应用简单的数学。如果我没有使用yield函数,而是使用一个列表理解,那么计算和和和和平均值将花费更长的时间(更不用说空间复杂性)。 Hadoop是一个很好的例子,可以利用发电机的所有优点。 有时您可以从itertools中摆脱tee函数,它为同一个生成器返回多个迭代器,这些迭代器可以独立使用。 如何使用[(iter中x的exp)]获得两者的好处?生成器理解和列表方法的性能 |
最新内容
相关内容
linux磁盘列表命令?
linux磁盘列表命令?,情况,管理,系统,单位,信息,数据,命令,磁盘,服务,时间,linux的进入磁盘命令1、查看磁盘空间 -df df命令以磁盘分区为单位查linux命令筛选列表?
linux命令筛选列表?,工具,状态,位置,工作,预期,命令,名称,标准,数据,系统,在Linux下面的某一个文件的查找命令linux命令如果记不得,可以使用manlinux的长列表命令?
linux的长列表命令?,工作,系统,信息,命令,数据,目录,电脑,软件,时间,设备,Linux命令行大全的目录1、linux系统常用操作命令linux系统常用操作linux命令正则表达式?
linux命令正则表达式?,工作,环境,基础,网络,单位,名称,平台,信息,正规,管理,Linux正则表达式正则表达式基本上是一种表示法,只要程序支持这种表linux目录列表命令?
linux目录列表命令?,系统,信息,标准,工作,命令,地址,时间,数据,名称,目录,linux查看目录下文件的命令linux系统下用ls命令列出当前目录下的文深入理解python函数传参机制
深入理解python函数传参机制,培训,对象,函数,变量,类型,复本,下面,操作,机制,内存,首先需要申明的一点是,python里是没有像C和C++里那样按值传总结python 元组和列表的区别
总结python 元组和列表的区别,培训,列表,括号,切片,包裹,两者,实例,元素,区别,操作,python的基本类型中有元组和列表这么俩个,但是这哥俩却比Python列表类型list合并有哪些方法
Python列表类型list合并有哪些方法?,培训,方法,列表,可能会,数组,切片,下文,字符串,数据类型,请看,在Python编程语言中,有各种数据类型,比如字符理解python中的select模块
理解python中的select模块,时间,系统,状态,培训,简介,设备,文件,内核,发生,进程,简介Python中的select模块专注于I/O多路复用,提供了selectpolPython常见的列表
Python常见的列表,合法,数据,概念,下来,较大,培训,数组,列表,类型,声明,python是一门非常简洁的语言,和c/c++,java等有着较大的差别。到list和tpython修改列表元素有什么方法
python修改列表元素有什么方法,代码,数据,步长,元素,基础,位置,培训,列表,切片,方法,增删改查是处理数据最常见的方法,前两种说过了,这里就要说python的filter,lambda函数表达式
python的filter,lambda函数表达式,代码,函数,名称,培训,列表,参数,知识点,表达式,约数,元素,filter(functionorNone,sequence),其中sequence可