python map,list(map),lambda和性能
我已经有过一段时间的程序程序员了,只是试图将我的思维方式转换为使用函数式编程(目前在Python 3中)。因此,而不是写一个for-
each循环,我试图把握之间的互动map
和list(map(..))
可以说我有一个简单的for-in
循环,它会进行一些资源密集的计算(print
为简单起见,在这里将其替换):
arr = [1,2,3,4]
for x in arr:
print(x)
现在,当我尝试执行以下操作时
map(lambda x: print(x), arr)
没什么,UNTIL,我将其包装在列表中,它完成了我的超重print
功能:
list(map(lambda x: print(x), arr))
为什么?我想念什么?我知道map返回一个迭代器,该迭代器应该节省内存,而不是立即保存整个列表。但是我的超重型print
功能什么时候会被触发呢?
-
为什么?我想念什么?我知道map返回一个迭代器,该迭代器应该节省内存,而不是立即保存整个列表。但是我的超重型
print
功能什么时候会被触发呢?该
map
函数在程序员术语中通常称为 lazy 。它不会做任何工作,除非它 有 。这在函数式编程中被广泛称为“
惰性评估”
。该map
函数不是立即计算任何值,而是返回所谓的
迭代器 。通过这样做,它委派了计算 返回给您 的值的工作。迭代器可以使用
next
以下方式计算单个值:>>> arr = [1, 2, 3] >>> it = map(lambda x: print(x), arr) >>> next(it) 1 >>>
但是,当您将地图迭代器转换为列表时,您将强制地图计算 其所有值 ,从而调用函数:
>>> it = map(lambda x: print(x), arr) >>> list(it) 1 2 3 4 [None, None, None, None] >>>