Я большой поклонник выражений генератора Python и понимания, но сегодня я подумал, что сделаю тест на производительность. Следующие тесты выполняются с Python 3.7.8 на FreeBSD.
>>> timeit.timeit('for n in filter(lambda n: n % 2 == 0, nums): n', setup = 'nums = [1,2,3,4,5,6,7,8,9]') 1.322555473074317 >>> timeit.timeit('for n in (n for n in nums if n % 2 == 0): n', setup = 'nums = [1,2,3,4,5,6,7,8,9]') 0.8492276258766651
Проклятие! Это довольно важно.
Причина, по которой я итерации и оцениваю элементы вместо того, чтобы просто использовать list ()
вокруг Filter ()
и перечислять понимание вместо генераторов, которые я думал, что это будет несправедливо преимущество выражения генератора, поскольку список
это функциональный вызов.
И я прав: это усугубляет разницу.
>>> timeit.timeit('list(filter(lambda n: n % 2 == 0, nums))', setup = 'nums = [1,2,3,4,5,6,7,8,9]') 1.4714625549968332 >>> timeit.timeit('[n for n in nums if n % 2 == 0]', setup = 'nums = [1,2,3,4,5,6,7,8,9]') 0.6537750540301204
Я удивлен, что замена для петли на создание списка фактически делает выражение генератора быстрее Анкет
Попробуем карта
Анкет
>>> timeit.timeit('for n in map(lambda n: n * 10, nums): n', setup = 'nums = [1,2,3,4,5,6,7,8,9]') 1.0912448461167514 >>> timeit.timeit('for n in (n * 10 for n in nums): n', setup = 'nums = [1,2,3,4,5,6,7,8,9]') 0.8008647549431771
Я думаю карта
быстрее, чем фильтр
Потому что это не включает в себя инструкции по разветвлению.
Давайте посмотрим, что произойдет, когда мы делаем оба сразу. Моя кишка говорит, что это самая большая победа, потому что генератору не нужно дважды итерации (я обещаю, что думал об этом перед тестированием).
>>> timeit.timeit('for n in map(lambda n: n * 10, filter(lambda n: n % 2 == 0, nums)): n', setup = 'nums = [1,2,3,4,5,6,7,8,9]') 1.9710871148854494 >>> timeit.timeit('for n in (n * 10 for n in nums if n % 2 == 0): n', setup = 'nums = [1,2,3,4,5,6,7,8,9]') 0.9152004329953343
Это вдвое быстрее! Реализация генератора обоих сразу бывает чуть более медленнее, чем одна из операций.
Итак, есть наш ответ: генераторы и понимание продувают карта
и фильтр
на скорости, как и на читабельности.
Оригинал: “https://dev.to/yujiri8/python-performance-benefits-of-generator-expressions-49od”