Python: List Comprehensions vs. map



参考这个 Python 列表理解与映射问题,有人可以解释为什么列表理解在列表理解不调用函数时比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

你所有的计时结果都可以用以下事实来解释:

  1. CPython具有相当高的函数调用开销。

  2. map(f, it)[f(x) for x in it]略快。

代码的第一个版本根本没有定义函数,因此没有函数调用开销。 第二个版本需要定义一个函数,所以每次迭代都有函数调用开销。 第三个版本与第二个版本完全等效——函数和 lambda 表达式是一回事。 根据事实 2,最后一个版本甚至更慢。

最新更新