Python:列表理解与地图

时间:2012-07-23 16:28:23

标签: python performance

参考这个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)

1 个答案:

答案 0 :(得分:12)

所有时间结果都可以通过以下事实来解释:

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

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

  3. 您的代码的第一个版本根本没有定义函数,因此没有函数调用开销。第二个版本需要定义一个函数,因此每次迭代都有函数调用开销。第三个版本完全等同于第二个版本 - 函数和lambda表达式是相同的。根据事实2,最后一个版本甚至更慢。