为什么不总是使用map,如果它比其他方式(list comprehension,循环(各种变体))更快?

2024-10-01 04:47:53 发布

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

我看到了一些文章和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:

^{pr2}$

循环变量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

地图:

start_time = time.time()
newlist = map(str.lower, oldlist)
print(time.time()-start_time) # 3.0994415283203125e-06

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

注意:我只是平均进行了五次迭代,所以这些时间值可能会有一点变化。然而,它给了我们一个暗示。 Python版本:3


Tags: infromimport列表fortime文章lower
1条回答
网友
1楼 · 发布于 2024-10-01 04:47:53

在编写代码时,性能并不总是第一要务。在很多情况下,如果列表理解有助于以后阅读和维护代码,我们可能不关心列表理解中丢失的µs。在

我相信列表理解比map更容易阅读和理解,尽管损失了一些性能。在

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

相关问题 更多 >