python映射、list(map)、lambda和performan

2024-05-20 21:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经做了一段时间的过程式程序员,只是想转换我的思维方式来使用函数式编程(目前在Python3中)。 因此,我没有编写for-each循环,而是试图掌握map和{}之间的交互作用

假设我有一个简单的for-in循环,它执行一些资源繁重的计算(为了简单起见,我在这里用print替换它):

arr = [1,2,3,4]    
for x in arr:
    print(x)

现在,当我试着做以下事情时

^{pr2}$

什么都不会发生,直到我把它包装成一个列表,它执行我的超重print函数:

list(map(lambda x: print(x), arr))

为什么?我错过了什么?我知道map返回一个迭代器,它应该节省内存,而不是直接保存整个列表。但是我的超重print功能什么时候会被触发呢?在


Tags: 函数inmap列表for过程编程方式
2条回答

Why? What am I missing? I understand map returns an iterator which is supposed to save memory instead of just holding the entire list right away. But when is my super heavy print function going to be triggered then?

map函数是程序员术语中通常所说的lazy。它不会做任何工作,除非必须。这在函数式编程中被称为lazy evaluationmap函数不是立即计算任何值,而是返回称为iterator的值。通过这样做,它把计算它的值的工作委托给你。在

迭代器可以使用next计算单个值:

>>> arr = [1, 2, 3]
>>> it = map(lambda x: print(x), arr)
>>> next(it)
1
>>> 

但是,当您将map迭代器强制转换为list时,您强制map计算其所有值,并因此调用函数:

^{pr2}$

正如你所说,你必须改变你的思维方式来使用函数式编程。函数式编程的一个关键概念是lazy evaluation,这是Haskell等语言中的默认策略。在

此策略的目的是通过仅在需要时计算某些内容来节省时间和内存。从这个意义上讲,Pythongenerators也接近函数范式。在

如果您想尽快执行它,那么如果您不关心结果,就不应该以函数样式编写它并用list()来修复它。使用循环是完全可以的。在

相关问题 更多 >