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

时间:2017-10-17 12:09:43

标签: 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) 
                    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

list comp:

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

1 个答案:

答案 0 :(得分:2)

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

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

EDIT,正如ayhan在评论中所描述的那样,你的例子是有偏见的,因为map返回一个生成器,因此它在迭代结束之前不生成任何内容,而列表推导在声明时计算整个列表。