Карта против списка против цикла в Python 3.7 - PullRequest
0 голосов
/ 25 февраля 2019

Когда я читаю статьи о скорости циклов и списков, а не карт, я обычно нахожу этот список, если он быстрее, чем карта при использовании лямбда-функций.

Вот тест, который я выполняю:

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

, поэтому карта является абсолютным победителем, хотя и с использованием лямбда-функции.Произошло ли изменение в Python 3.7, вызвавшее это заметное повышение скорости?

1 Ответ

0 голосов
/ 25 февраля 2019

Прежде всего, для сравнения тарифов необходимо преобразовать результат функции map в список.map в Python 3.X возвращает объект итератора, а не список.Во-вторых, в реализации CPython встроенные функции фактически являются обертками вокруг функций c, что делает их быстрее, чем любой код Python с той же функциональностью, хотя, когда вы используете lambda во встроенной функции, вы фактически разрываете цепочку, и этосделает это примерно так же быстро, как и код Python.

Еще один важный момент - это то, что понимание списков - это просто синтаксический сахар вокруг обычного цикла, и вы можете использовать его, чтобы избежать дополнительных вызовов функций, таких как добавление в списки и т. д.

...