【发布时间】:2012-07-23 16:28:22
【问题描述】:
参考这个Python List Comprehension Vs. Map 问题,有人可以解释为什么当列表理解不调用函数时,列表理解比map 给出更好的结果,即使map 中没有lambda 函数但给出最差的结果调用函数时?
import timeit
print timeit.Timer('''[i**2 for i in xrange(100)]''').timeit(number = 100000)
print timeit.Timer('''map(lambda i: i**2, xrange(100))''').timeit(number = 100000)
print timeit.Timer(setup="""def my_pow(i):
return i**2
""",stmt="""map(my_pow, xrange(100))""").timeit(number = 100000)
print timeit.Timer(setup="""def my_pow(i):
return i**2
""",stmt='''[my_pow(i) for i in xrange(100)]''').timeit(number = 100000)
结果:
1.03697046805 <-- list comprehension without function call
1.96599485313 <-- map with lambda function
1.92951520483 <-- map with function call
2.23419570042 <-- list comprehension with function call
【问题讨论】:
-
map中调用的函数是 lambda 函数还是常规函数都没有关系,开销仍然存在。不知道为什么列表理解 with 函数调用会比map()慢。 -
@millimoose 但是每次迭代都会声明 lambda 函数,这有什么改变吗?
-
@zenpoy:函数调用参数在函数被调用之前被评估,所以函数只声明一次。
-
无法删除我手机上的 cmets :(
-
@SvenMarnach 我认为他/她在谈论
my_pow定义在整个 timeit 执行(在设置中)只解释一次,并且 lambda 为每次迭代定义。这是一个有效的问题,而 lambda 可能导致它的版本稍慢。
标签: python performance