Python 通过map()函数返回map对象如何帮助更好地管理内存和提高性能

Python 通过map()函数返回map对象如何帮助更好地管理内存和提高性能,python,Python,对于Python3+,map()函数返回一个map对象(),而不是list,当我试图找出原因时,一些帖子(如)建议它有助于更好的内存管理和性能 因为我是Python新手,所以我真的无法完全理解“如何”它可以帮助更好的内存管理和性能。我能想到的最好的方法是——假设如果map()返回了list对象,而不是返回map对象,那么我不需要将map对象转换为list,比如list(map(…),但是由于map对象是返回的,所以在下一步中我必须调用list()函数 我知道一个论点可能是,您可以直接循环映射对象

对于Python3+,
map()
函数返回一个map对象(
),而不是list,当我试图找出原因时,一些帖子(如)建议它有助于更好的内存管理和性能

因为我是Python新手,所以我真的无法完全理解“如何”它可以帮助更好的内存管理和性能。我能想到的最好的方法是——假设如果
map()
返回了list对象,而不是返回map对象,那么我不需要将map对象转换为list,比如
list(map(…)
,但是由于map对象是返回的,所以在下一步中我必须调用
list()
函数

我知道一个论点可能是,您可以直接循环映射对象,但此时必须分配内存,并且必须对传递给
map()
的函数进行求值,那么,如果我现在执行或稍后执行一步,会有什么不同



更新:有人建议,这可能是一个重复的,但我不认为答案是全面回答问题的“内存管理”和“性能”的好处

Python3的
map
返回一个迭代器(您在输出中看到的
map
对象)。这个迭代器是惰性的,它一次只对输入迭代器中的一个值应用函数,以生成一个输出值。当输入也是一个惰性迭代器,并且每次可以使用一个值时,这非常方便

考虑以下代码:

with open(some_file) as f_in, open(some_file + ".out", "w") as f_out:
    f_out.writelines(map(line_transform_func, f_in))
这将打开两个文件,一个用于读取,一个用于写入。然后它从输入文件中读入行,对它们执行某种转换,然后将它们写入输出文件。因为文件是惰性的,所以不需要将输入文件的全部内容一次读入内存。相反,您只需要足够的内存一次读取一行。类似地,由于
map
返回一个惰性迭代器,转换后的行将一次生成一行,
writelines
方法可以在请求下一行之前将每一行写入磁盘。如果文件很大(几GB,可能一次超过内存容量),这一点非常重要

map
作为惰性迭代器的另一个优点是,如果您提前停止对输出的迭代,它不需要对所有输入运行其函数。例如,假设您要对一个大的输入序列进行昂贵的计算,但您只需要在找到满足某些条件的第一个输出之前进行计算。您可以使用
map
和带有
break
语句的循环,在找到所需的值后立即停止迭代:

for value in map(some_expensive_operation, input_values):
    if some_criteria(value):
        break
如果
map
生成了一个列表,那么在迭代发生之前,它需要对输入的所有值应用昂贵的操作

(请注意,我通常不会使用
map
编写这些示例中的任何一个,我只会为
循环编写一个显式的
,然后自己应用函数,但是
map
也可以很好地工作。)


如果您不熟悉Python迭代器,我强烈建议您仔细阅读它们。它们是Python工作方式的重要组成部分,了解它们(以及如何创建和使用新的惰性对象,例如生成器函数)是成为更熟练的Python程序员的重要组成部分。

可能重复的大致情况,如果您循环Py3
映射
对象,那么您在任何时候都只能在内存中保存iterable的每个项,而不是整个iterable(比如使用
列表
);有关其他详细信息,请参阅我的建议dupe/differences@Chris_Rands是的,我确实看到了你的愚弄建议,但我不认为答案是关于“内存管理”和“性能”好处的全面回答。@hagrawal请阅读其他答案。我不明白你不明白的地方,您了解迭代器/生成器在Python中通常是如何工作的吗?