Python 地图的空间复杂性

Python 地图的空间复杂性,python,lambda,generator,Python,Lambda,Generator,python社区建议尽可能使用带有lambda的map,而不是循环。例如: 方法1:使用列表理解 return [element*2 for element in myList] 方法2:使用带有lambda的map return list(map(lambda element: element*2, myList)) 方法3:While循环 i = 0 while i < len(myList): myList[i] *= 2 i += 1 return myList

python社区建议尽可能使用带有lambda的map,而不是循环。例如:

方法1:使用列表理解

return [element*2 for element in myList]
方法2:使用带有lambda的map

return list(map(lambda element: element*2, myList))
方法3:While循环

i = 0
while i < len(myList):
    myList[i] *= 2
    i += 1
return myList
i=0
而我
然而,空间复杂性是:

方法1发电机:O(n)

方法2地图:O(n)

方法3循环:O(1)


我错过什么了吗?为什么使用生成器或地图更高级?

关于您的问题的评论已经非常清楚该问题的错误所在

但要回答“为什么使用生成器[…]更优越?”,至少在可能的情况下是这样-因为没有解决方案总是独立于上下文的更好的:

  • 生成器可以传递并具有状态,循环不能和不可以(默认情况下不是这样;您可以添加它,但您将构建自制生成器)
  • 生成器可以被组合,并且(如果编写正确的话)仍然可以利用并行性,循环只能在事先知道完整的函数组合的情况下进行,或者在生成器函数中编写循环,在这种情况下,无论如何都要构建一个生成器
以及“为什么使用[…]映射更优越?”,至少在可能的情况下是这样-因为没有一种解决方案总是独立于上下文的更好的:

  • map
    是一个正确的选择,如果您已经有了一个函数和一个iterable,并且只需要编写一个生成器就可以了
    map(sqrt,xs)
    vs
    (sqrt(x)表示xs中的x)
  • map
    有一些功能需要工作,如果您有多个可从中选择函数输入的可编辑输入,则会混淆您试图执行的操作。
    例如
    map(pair[1,2,3,4,5],'a','b','c'])
    (其中
    pair
    采用两个参数)

而且,一般来说,更容易理解和维护的解决方案通常是更好的解决方案,即使另一个解决方案的性能可能稍好一些。性能提升与可维护性的提高是一个必须权衡的权衡。

“Python社区建议使用LAMBDA使用MAP代替可能的循环”Note,您的生成器不是生成器,而是列表理解。如果您使用了生成器表达式,它将是O(1)空间复杂度。同样地,
list(map(lambda元素:element*2,myList))
map
迭代器创建一个列表,因此当然,您不会获得任何空间效率,但是如果您直接使用map迭代器,它就是O(1)。注意,您的循环已中断,您应该在此处使用for循环,而不是while循环。除了上面的注释外,方法1和2还创建了一个新列表,而方法3在适当的位置对列表进行了修改。这种区别通常比O(n)和O(1)更严重。