参考这个Python List Comprehension Vs. Map问题,有人可以解释为什么当列表理解不调用函数时,列表理解会在map
上提供更好的结果,即使{{1}中没有lambda函数也是如此但是在调用函数时会给出最差的结果吗?
map
结果:
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)
答案 0 :(得分:12)
所有时间结果都可以通过以下事实来解释:
CPython的函数调用开销相当高。
map(f, it)
略快于[f(x) for x in it]
。
您的代码的第一个版本根本没有定义函数,因此没有函数调用开销。第二个版本需要定义一个函数,因此每次迭代都有函数调用开销。第三个版本完全等同于第二个版本 - 函数和lambda表达式是相同的。根据事实2,最后一个版本甚至更慢。