功能和功能列表

时间:2012-05-25 21:47:38

标签: python

我很惊讶这篇文章here中描述的一些zipmap选项的表现。

(我还是新来的,所以我无法评论那个帖子。)

特别是,我有兴趣比较列表理解:

[f(x) for f,x in zip(functions, values)]

到地图调用:

map(lambda f,x: f(x), functions, values)

我听说lambda很贵,但是不会映射涉及更少的函数调用吗?

谢谢!

1 个答案:

答案 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

我们可以看到列表理解无论如何都会在性能上获胜。