参考这个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还是常规函数,开销仍然存在。不知道为什么带有函数调用的列表推导式比map()
慢。 - millimoosemy_pow
的定义只被解释一次,而lambda表达式在每次迭代中都会被定义。这是一个有效的问题,也许lambda表达式导致它的版本稍微慢一些。 - soulcheck