我很惊讶这篇文章here中描述的一些zipmap选项的表现。
(我还是新来的,所以我无法评论那个帖子。)
特别是,我有兴趣比较列表理解:
[f(x) for f,x in zip(functions, values)]
到地图调用:
map(lambda f,x: f(x), functions, values)
我听说lambda很贵,但是不会映射涉及更少的函数调用吗?
谢谢!
答案 0 :(得分:3)
首先,对性能的可读性 - 除非您能证明这是您的程序的瓶颈,否则请使用更易读的列表理解。
如果它 是一个瓶颈,那么就做一些性能测试(参见the timeit
module) - 但除非所有的功能都是微不足道的,否则它可能无关紧要。
快速测试:
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
我们可以看到列表理解无论如何都会在性能上获胜。