1

我想知道这篇文章中描述的一些 zipmap 选项的性能

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

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

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

到地图电话:

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

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

谢谢!

4

1 回答 1

3

首先,可读性高于性能——除非你能证明这是你的程序的瓶颈,否则使用可读性更强的列表理解。

如果它一个瓶颈,那么做一些性能测试(参见模块)——但除非所有的功能都是微不足道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

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

于 2012-05-25T21:49:44.080 回答