列表推导式 vs map函数

961

在使用Python编程语言中,使用 map() 函数和列表推导式有没有具体的优势?它们哪个更高效或被认为更符合 Python 的编程风格呢?


16
请注意,PyLint会警告您如果使用map而不是列表推导式,请参见message W0141 - lumbric
5
@lumbric,我不确定,但只有在使用lambda函数时,它才起作用。 - 0xc0de
8
我制作了一个关于列表推导式和map函数的17分钟教程,如果有人觉得有用的话可以参考一下 - https://www.youtube.com/watch?v=hNW6Tbp59HQ - Brendan Metcalfe
YouTube视频的标题是“Python - 列表推导式 vs map函数教程(速度,lambda,历史,示例)”。 - Peter Mortensen
14个回答

1
性能测量

Enter image description here

图片来源:Experfy

你可以亲自看出哪个更好 - 列表推导式还是map函数。

(与map函数相比,列表推导式在处理100万条记录时需要更少的时间。)


3
不清楚运行了什么确切的代码或样本大小。无论如何,for循环和map之间的巨大差异似乎是不正确的。 - Nico Schlömer
源参考不够准确。它确切地来自哪里?请通过编辑(更改)您的答案进行回复,而不是在此处进行评论(但请勿添加“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天编写的)。 - Peter Mortensen

1

我尝试了@alex-martelli的代码,但发现一些差异。

python -mtimeit -s "xs=range(123456)" "map(hex, xs)"
1000000 loops, best of 5: 218 nsec per loop

python -mtimeit -s "xs=range(123456)" "[hex(x) for x in xs]"
10 loops, best of 5: 19.4 msec per loop

使用map函数处理非常大的范围时,所需时间相同,而使用列表推导式则需要很长时间,这从我的代码中可以明显看出。因此,除了被认为是“不符合Python风格”之外,我没有遇到与使用map相关的性能问题。


6
这是一个非常老的问题,你所提到的答案很可能是针对Python 2写的,因为在Python 2中map返回一个列表。而在Python 3中,map是惰性求值的,所以仅仅调用map并不会计算出任何新列表元素,这就是为什么你得到如此短的时间的原因。 - kaya3
我认为你正在使用Python 3.x。当我提出这个问题时,Python 3刚刚发布不久,而Python 2.x仍然是标准。 - TimothyAWiseman

0

我认为最Pythonic的方式是使用列表推导式而不是mapfilter。原因是列表推导式比mapfilter更清晰。

In [1]: odd_cubes = [x ** 3 for x in range(10) if x % 2 == 1] # using a list comprehension

In [2]: odd_cubes_alt = list(map(lambda x: x ** 3, filter(lambda x: x % 2 == 1, range(10)))) # using map and filter

In [3]: odd_cubes == odd_cubes_alt
Out[3]: True

正如您所看到的,列表推导式不需要额外的lambda表达式,而map则需要。此外,列表推导式还可以轻松过滤,而map需要filter才能进行过滤。


0

我的使用情况:

def sum_items(*args):
    return sum(args)


list_a = [1, 2, 3]
list_b = [1, 2, 3]

list_of_sums = list(map(sum_items,
                        list_a, list_b))
>>> [3, 6, 9]

comprehension = [sum(items) for items in iter(zip(list_a, list_b))]

我发现自己开始更多地使用map,我认为由于传递和返回参数,map可能比comp慢,这就是我找到这篇文章的原因。

我相信使用map可以使代码更易读和灵活,特别是当我需要构造列表值时。

如果你使用过map,你会在阅读时真正理解它。

def pair_list_items(*args):
    return args

packed_list = list(map(pair_list_items,
                       lista, *listb, listc.....listn))

再加上灵活性奖金。 感谢所有其他答案,再加上绩效奖金。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接