2012-05-25 142 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贏得了表演。