【问题标题】:Map vs list comprehension in Python [duplicate]Python中的映射与列表理解[重复]
【发布时间】:2011-02-28 02:06:27
【问题描述】:

可能重复:
Python List Comprehension Vs. Map

什么时候应该使用 map/filter 而不是列表解析或生成器表达式?

【问题讨论】:

    标签: python


    【解决方案1】:

    你可能想看看这个问题的回答:

    Python List Comprehension Vs. Map

    另外,这里有一篇来自 Python 的创建者和 BDFL Guido 的相关文章:

    http://www.artima.com/weblogs/viewpost.jsp?thread=98196

    就我个人而言,我更喜欢列表推导式和生成器表达式,因为它们的含义在阅读代码时更加明显。

    【讨论】:

      【解决方案2】:

      列表推导式和生成器表达式通常被认为更符合 Python 风格。在编写 python 代码时,最好使用列表推导和生成器表达式,因为这是 python 程序员倾向于做事的方式。

      映射和过滤都返回列表对象,就像列表推导一样。生成器表达式返回一个生成器。使用生成器,计算会根据需要进行,而不是计算和存储结果。如果输入大小很大,这可能会导致较低的内存使用量。另外,请记住,生成器不可索引。它们必须按顺序读取。

      下面是一些示例,说明在使用不同的方法转换数字序列并使用列表推导、生成器表达式和映射求和时,内存使用会有何不同。

      k=1000
      
      def transform(input):
          return input + 1
      
      """
        1. range(k) allocates a k element list [0...k]
        2. Iterate over each element in that list and compute the transform
        3. Store the results in a list
        4. Pass the list to sum
      
      Memory: Allocates enough 2 lists of size k
      """
      print sum([transform(i) for i in range(k)])
      
      """
        1. Create an xrange object
        2. Pass transform and xrange object to map
        3. Map returns a list of results [1...k+1]
        4. Pass list to sum
      
      Memory: Creates a constant size object and creates a list of size k
      """
      print sum(map(transform, xrange(k)))
      
      """
        1. Create an xrange object
        2. Create a generator object
        3. Pass generator object to sum
      
      Memory: Allocates 2 objects of constant size
      """
      print sum(transform(i) for i in xrange(k))
      
      """
      Create a generator object and operate on it directly
      """
      g = (transform(i) for i in xrange(k))
      print dir(g)
      print g.next()
      print g.next()
      print g.next()
      

      【讨论】:

      • “映射和过滤器来自更多的函数式语言。” 列表推导式(受 Haskell 中的特性启发)和生成器表达式(源自列表推导式和--really--更像是你在非严格的函数式语言中执行的那种操作。)
      • 我知道定义是什么。我想知道您为什么要在列表理解上使用 map 的原因。
      • 我的措辞不好,所以我删掉了。根据我的经验,map/filter 在函数式(尽管是严格的函数式)语言中比列表理解更多地使用,因为列表理解将是 map/filter 之上的语法糖,我知道许多语言试图限制皮肤的方式数量猫。
      • 随心所欲。当我写 python 时,我总是在 map 上使用列表理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2018-11-13
      • 2010-11-21
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多