python 3.7 中的地图 vs 列表 vs 循环
Map vs List vs loop in python 3.7
在阅读有关 Loop vs List comprehension vs Map 的速度的文章时,我通常发现在使用 lambda 函数时,list comprehension 比 map 快。
这是我的测试 运行:
import timeit
def square(range):
squares = []
for number in range:
squares.append(number*number)
return squares
print(timeit.timeit('map(lambda a: a*a, range(100))', number = 100000))
print(timeit.timeit('[a*a for a in range(100)]', number = 100000))
print(timeit.timeit('square(range(100))', 'from __main__ import square', number = 100000))
结果:
0.03845796199857432
0.5889980600004492
0.9229458660011005
所以 Map 显然是赢家,尽管它使用了 lambda 函数。 python 3.7 中是否有变化导致这种显着的速度提升?
首先,要进行票价比较,您必须将 map
函数的结果转换为列表。 map
in Python 3.X returns 迭代器对象不是列表。其次,在 CPython 实现中,内置函数实际上是 c 函数的包装器,这使得它们比具有相同功能的任何 Python 代码更快,尽管当您在内置函数中使用 lambda
时 -在功能上你实际上是在打破链条,这将使它大约和 Python 代码一样快。
另一个重要的一点是,列表推导式只是常规循环的语法糖,您可以使用它来避免额外的函数调用,例如附加到列表等。
在阅读有关 Loop vs List comprehension vs Map 的速度的文章时,我通常发现在使用 lambda 函数时,list comprehension 比 map 快。
这是我的测试 运行:
import timeit
def square(range):
squares = []
for number in range:
squares.append(number*number)
return squares
print(timeit.timeit('map(lambda a: a*a, range(100))', number = 100000))
print(timeit.timeit('[a*a for a in range(100)]', number = 100000))
print(timeit.timeit('square(range(100))', 'from __main__ import square', number = 100000))
结果:
0.03845796199857432
0.5889980600004492
0.9229458660011005
所以 Map 显然是赢家,尽管它使用了 lambda 函数。 python 3.7 中是否有变化导致这种显着的速度提升?
首先,要进行票价比较,您必须将 map
函数的结果转换为列表。 map
in Python 3.X returns 迭代器对象不是列表。其次,在 CPython 实现中,内置函数实际上是 c 函数的包装器,这使得它们比具有相同功能的任何 Python 代码更快,尽管当您在内置函数中使用 lambda
时 -在功能上你实际上是在打破链条,这将使它大约和 Python 代码一样快。
另一个重要的一点是,列表推导式只是常规循环的语法糖,您可以使用它来避免额外的函数调用,例如附加到列表等。