Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果map比其他的(列表理解、循环(各种变体))快,为什么不总是使用map呢?_Python_Python 3.x_Loops_Dictionary_List Comprehension - Fatal编程技术网

Python 如果map比其他的(列表理解、循环(各种变体))快,为什么不总是使用map呢?

Python 如果map比其他的(列表理解、循环(各种变体))快,为什么不总是使用map呢?,python,python-3.x,loops,dictionary,list-comprehension,Python,Python 3.x,Loops,Dictionary,List Comprehension,我遇到了一些文章和StackOverflow讨论,其中通常建议在处理列表时使用列表理解 我通常会遇到一个常见的循环结构,其中我有一个列表,我必须处理它并将结果存储在一个新的列表中 比如(举个例子): 1) 创建一个大的字符串列表,以供使用 from random import choice from string import ascii_uppercase import time oldlist = ([''.join(choice(ascii_uppercase)

我遇到了一些文章和StackOverflow讨论,其中通常建议在处理列表时使用列表理解

我通常会遇到一个常见的循环结构,其中我有一个列表,我必须处理它并将结果存储在一个新的列表中

比如(举个例子):

1) 创建一个大的字符串列表,以供使用

from random import choice
from string import ascii_uppercase
import time

oldlist = ([''.join(choice(ascii_uppercase) 
                    for i in range(10)) for x in range(1000000)])
2) 使用循环、列表理解和映射处理它 循环变量1:

start_time = time.time()
newlist = []
for word in oldlist:
    newlist.append(word.lower())
print(time.time()-start_time) # 0.1368732452392578
循环变量2:

start_time = time.time()
newlist = []
append = newlist.append
for word in oldlist:
    append(word.lower())
print(time.time()-start_time)# 0.1112520694732666
列表组件:

start_time = time.time()
newlist = [word.lower() for word in oldlist]
print(time.time()-start_time) # 0.07511067390441895
地图:

我能假设在这种情况下,地图应该总是被使用,因为它比其他的都快吗?根据不同的文章,列表理解被认为更具可读性,但可读性应该是第一优先考虑的还是一个显著的速度

注意:我只是平均进行了五次迭代,所以这些时间值可能会有一些变化。然而,它给了我们一个指示。
Python版本:3在编写代码时,性能并不总是第一位的。在很多情况下,如果有助于以后阅读和维护代码,我们可能不关心列表理解中丢失的µs

我相信列表理解比映射更容易阅读和理解,尽管性能损失很小


编辑,正如ayhan在评论中所描述的,您的示例是有偏见的,因为
map
返回一个生成器,所以它在迭代之前不会生成任何内容,而列表理解在声明时计算整个列表。

@MaximeLorant我认为其中一个更通用。我问了一个具体的情况。您应该使用
timeit
模块进行此类基准测试。
map(str.lower,oldlist)
不返回列表,因此这是一个不公平的比较。如果添加列表调用,两者所需的时间大致相同。考虑到map将一个函数应用于iterable的每个元素,每个map/列表理解比较都和这个一样具体。@ayhan忽略了这一点。它消除了混乱。对于列表,map所占的比例略高于列表comp。您能否将ayhanścomment的解释添加到您的答案中,以便我可以接受它作为一个答案。我得到了不同的结果,因为我没有以公平的方式进行比较。@engr_我可以,但因为这不是我的观点(一般来说,在Py3中,map确实生成了一个生成器),这只不过是偷取了一个答案:)我知道,但艾翰在评论中使用了它,所以他可能不会介意:)我认为,如果在其中一个答案中提到我的错误,那么其他人在比较中看到我的错误会比在评论中看到我的错误更容易理解。如果Ayhan把它作为一个单独的答案,我也很乐意接受。
start_time = time.time()
newlist = map(str.lower, oldlist)
print(time.time()-start_time) # 3.0994415283203125e-06