在使用Python编程语言中,使用 map() 函数和列表推导式有没有具体的优势?它们哪个更高效或被认为更符合 Python 的编程风格呢?
在使用Python编程语言中,使用 map() 函数和列表推导式有没有具体的优势?它们哪个更高效或被认为更符合 Python 的编程风格呢?
我尝试了@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相关的性能问题。
map
返回一个列表。而在Python 3中,map
是惰性求值的,所以仅仅调用map
并不会计算出任何新列表元素,这就是为什么你得到如此短的时间的原因。 - kaya3我认为最Pythonic的方式是使用列表推导式而不是map
和filter
。原因是列表推导式比map
和filter
更清晰。
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
才能进行过滤。
我的使用情况:
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))
再加上灵活性奖金。 感谢所有其他答案,再加上绩效奖金。