python map,list(map),lambda和性能

发布于 2021-01-29 16:31:31

我已经有过一段时间的程序程序员了,只是试图将我的思维方式转换为使用函数式编程(目前在Python 3中)。因此,而不是写一个for-
each循环,我试图把握之间的互动maplist(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功能什么时候会被触发呢?

关注者
0
被浏览
170
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    为什么?我想念什么?我知道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]
    >>>
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看