Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Что быстрее работает в питоне: list(filter(lambda или соответствующее listcomp?

#python #производительность #lambda


В общем такой вопрос. Что быстрее lamda функции и filter или же генераторы? Для примера
такой код. 

list(filter(lambda pr: projectsIds.get(pr['id'], 0), projects))
[pr for pr in projects if projectsIds.get(pr['id'], 0)]


Если правильно верить интернету то генераторы быстрее, но мало ли что я упустил.
    


Ответы

Ответ 1



Генератор списка быстрее. Автор не указывал входные данные, поэтому придумал свои. После используя модуль timeit замерил скорость: projectsIds = {i: 0 if i % 2 == 0 else 1 for i in range(100)} projects = [{'id': i, 'name': str(hex(i))} for i in range(1000)] NUMBER = 1000 stmt_1 = "list(filter(lambda pr: projectsIds.get(pr['id'], 0), projects))" stmt_2 = "[pr for pr in projects if projectsIds.get(pr['id'], 0)]" from timeit import timeit print(timeit(stmt_1, globals=globals(), number=NUMBER)) print(timeit(stmt_2, globals=globals(), number=NUMBER)) Результат: 0.25851418078971294 0.18717311314930685

Ответ 2



Как всегда: "It depends." list(filter может быть быстрее и медленнее чем listcomp: In: %timeit list(filter(lambda x: x, range(1000))) Out: 136 µs ± 1.63 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) In: %timeit [x for x in range(1000) if x] Out: 51.6 µs ± 537 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) In: %timeit list(filter(bool, range(1000))) Out: 27.7 µs ± 222 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) lambda вариант самый медленный, if x вариант быстрее, вариант с явной именованной функции bool и filter быстрее всех здесь (filter(None —  похожее время). Все варианты одинаковый результат возвращают. Если ваш profiler не говорит, что выражение с listcomp или filter является узким местом в вашем коде, то используйте самый читаемый вариант: если у вас есть именованная функция (к примеру: odd(n)), то вариант с filter(odd, numbers) выглядит чище, если у вас просто безымянное выражение в качестве условия, то вариант с genexpr/listcomp более подходящий.

Комментариев нет:

Отправить комментарий