我想知道这篇文章中描述的一些 zipmap 选项的性能。
(我还是新来的,所以我不能评论那个帖子)。
特别是,我对比较列表理解感兴趣:
[f(x) for f,x in zip(functions, values)]
到地图电话:
map(lambda f,x: f(x), functions, values)
我听说 lambda 很贵,但 map 不会涉及更少的函数调用吗?
谢谢!
首先,可读性高于性能——除非你能证明这是你的程序的瓶颈,否则使用可读性更强的列表理解。
如果它是一个瓶颈,那么做一些性能测试(参见模块)——但除非所有的功能都是微不足道的timeit
,否则这两种方法都可能无关紧要。
做一个快速测试:
python -m timeit -s "functions = [lambda x: x+y for y in range(1000)]" -s "values = list(range(1000))" "[f(x) for f,x in zip(functions, values)]"
1000 loops, best of 3: 207 usec per loop
python -m timeit -s "functions = [lambda x: x+y for y in range(1000)]" -s "values = list(range(1000))" "list(map(lambda f,x: f(x), functions, values))"
1000 loops, best of 3: 315 usec per loop
如果你想要一个生成器表达式:
python -m timeit -s "functions = [lambda x: x+y for y in range(1000)]" -s "values = list(range(1000))" "list(f(x) for f,x in zip(functions, values))"
1000 loops, best of 3: 250 usec per loop
并使用 Python 2.x 的旧式映射,它会立即生成一个列表以确保完整性(相当于列表理解示例):
python2 -m timeit -s "functions = [lambda x: x+y for y in range(1000)]" -s "values = list(range(1000))" "map(lambda f,x: f(x), functions, values)"
1000 loops, best of 3: 234 usec per loop
我们可以看到列表理解无论如何都会在性能上获胜。