2012-05-25 89 views
1

我对这篇文章here中描述的一些zipmap选项的性能感到惊讶。函数和函数参数列表

(我在这里还是新手,所以我无法对该主题发表评论)。

尤其是我感兴趣的列表理解比较:

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

到地图调用:

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

我听说拉姆达是昂贵的,但不会映射涉及更少的函数调用?

谢谢!

+2

“lambda昂贵”是无稽之谈。 –

+1

CatPlusPlus说了些什么,还有如何自己测试它? http://docs.python.org/library/timeit.html – rantanplan

+1

@CatPlusPlus *相对*昂贵。一次又一次的测试会告诉你,如果你在地图上使用'lambda',列表理解将优于'map()'。 –

回答

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 

我们可以看到列表compr无论如何,ehension赢得了表演。