关于python:为什么不总是使用map,如果它比其他的更快(列表理解、循环(各种变体))?

why not always use map if its faster than the rest (list comprehension, loop (various variants))?

本问题已经有最佳答案,请猛点这里访问。

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

我通常遇到一个公共的循环结构,在这里我有一个列表,我必须处理它并将结果存储在一个新的列表中。

比如(为了举例):

1)创建一个大型的弦列表,用于演奏

1
2
3
4
5
6
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:

1
2
3
4
5
start_time = time.time()
newlist = []
for word in oldlist:
    newlist.append(word.lower())
print(time.time()-start_time) # 0.1368732452392578

循环变量2:

1
2
3
4
5
6
start_time = time.time()
newlist = []
append = newlist.append
for word in oldlist:
    append(word.lower())
print(time.time()-start_time)# 0.1112520694732666

清单:

1
2
3
start_time = time.time()
newlist = [word.lower() for word in oldlist]
print(time.time()-start_time) # 0.07511067390441895

地图:

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

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

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


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

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

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