Тест скорости лямбда-выражения против локальной функции в Python - PullRequest
1 голос
/ 07 октября 2019

У меня есть два списка:

x = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
y = ['a','b','c','d','e','f','g','h','i','j']

Я объединяю эти списки, чтобы получить словарь, подобный следующему:

z = {97: 'a', 98: 'b', 99: 'c', 100: 'd', 101: 'e', 102: 'f', 103: 'g', 104: 'h', 105: 'i', 106: 'j'}

Я выполняю эту задачу с помощью mapфункция.

Это можно сделать двумя способами:

первый способ:

z = map(lambda a,b : (a+97 , b), x, y)

второй способ:

def fun(a,b): return (a+97, b)
z = dict(map(fun, x, y))

АНАЛИЗ:

import timeit

min(timeit.repeat(lambda:dict(map(lambda a,b:(a+97,b),x,y))))

def fun(a,b):
    return (a+97, b)

min(timeit.repeat(lambda:dict(map(fun, x, y))))

Приведенный выше код дает мне следующий вывод:

8.535995744000047

8.080758586999991

Этот код имеет разницу во времени 0.45523715700005596 ms. Мне сообщили, что лямбда-выражения аналогичны встроенным функциям, которые используются для повышения производительности (скорости выполнения).

Но в соответствии с приведенным выше результатом кажется, что эта мысль является мифом. Есть ли какая-то особая причина этих странных временных тестов? Являются ли локальные функции с одинаковым содержимым более быстрыми, чем лямбда-выражения?

Я знаю и третий способ выполнения вышеупомянутой задачи, то есть

z = dict([(k+97 , v) for k,v in zip(x, y)])

с 7.950903342999936 ms,

Но меня больше интересуют приведенные выше результаты испытаний.

1 Ответ

0 голосов
/ 07 октября 2019

Использование min - ужасная мера производительности, поскольку на скорость выполнения любой программы влияют другие процессы, выполняющиеся на машине. Среднее по значимой выборке гораздо более информативно

Почему лямбда медленнее

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

foo = lambda a, b: (a + 97, b)
min(timeit.repeat(lambda:dict(map(foo, x, y))))
...