Сравнение быстродействия def и lambda-функций Python 3.x
Сравним быстродействие def и lambda-функций. Предположительно, lambda, заточенный под однострочники, будет быстрее выполняться и создаваться.
8К открытий8К показов
Идея для кода
Читая pep8, я наткнулся на пункт об использовании анонимных функций — по версии pep8, они снижают читабельность, если использовать переменную с значением функции как функцию, лучше использовать def. Я решил сравнить def и lambda-функции по другому параметру — быстродействию. Предположительно, lambda, заточенный под однострочники, будет быстрее выполняться и создаваться. В этом исследовании я это проверю.
Библиотеки
Так как здесь будет много измерений времени, то несомненно, нам понадобится библиотека time, а также turtle, чтобы чертить разного рода графики. Я знаю, что это непрактично, но matprolib слишком долго (секунд 10) импортируется. Итак:
Общие функции
В нашем коде для измерения быстродействия нужна соответствующая функция. Она будет главной для всех производных. Прежде всего, мы будем измерять время выполнения не один раз — слишком велика погрешность. Функция будет принимать в аргументы функцию, для которой проводится замер, а также количество повторений этой функции.
Для самого измерения мы будем использовать разницу во времени между началом выполнения и концом. Из описания складывается код:
Всего у нас будет 2 диаграммы: полная и усредненная. В каждой по 2 графика: для def и lambda функций. Всего нам потребуется 4 черепахи.
Список значений для 1 и 2 графика очевиден — несколько результатов выполнения замера скорости. С 3 и 4 всё сложнее — нужно найти среднее арифметическое одного из 2 первых графиков. Дабы слишком не заморачиваться над тем, чтобы график никуда не вылезал, найдём разницу между каждым элементом каждого графика и средним значением между средними арифметическими из 1 и 2 графика. В итоге, на графике мы будем видеть не общее значение, а разницу.
Все графики занесём в общий словарь, чтобы не создавать много переменных. Словарь заранее объявлен за пределами функции.
Функции для упрощения жизни
Кому захочется повторять одно и то действие, но с разными параметрами? Никому. Поэтому, я и написал некоторые вспомогательные функции, для рисования графика по заданным параметрам, для создания черепахи. Кстати, о последнем — черепахи тоже заносятся в общий словарь.
Производные функции
Слабонервным людям, ненавидящим многоуровневые вложения, не читать.
Для ранее описанных общих функций можно создавать бесконечно много проиводных. Для производной замера скорости структура такая:
А производная для функции построения графика — это же самая функция с определенными аргументами.
Мы будем проверять скорость создания и скорость выполнения разного вида функций.
Вернёмся к первому. В случае проверки скорости создания функции, функция_для_замера() будет иметь одну цель — создать внутри себя def или lambda функцию. Её мы будем вызывать множество раз, и каждый раз она будет создавать одну и ту же функцию заново. Иными словами — функция второго уровня вложенности служит для многократного вызова и создания во время каждого функции третьего уровня вложенности.
Я мог бы сделать легче, но хотел сохранить структуру для всех производных функций.
Первые две производные — для создания пустых функций, возвращающих False. Для def я мог бы написать с использованием return или pass, но в lambda это невозможно.
Следующие две — для таких же функций, но с простым выражением:
Еще две — для оценки скорости их создания и скорости выполнения:
Эти функции будут использованы в производных от graph_data:
Алгоритм
Присвоим имя окну:
Создадим четыре черепахи для рисования графика:
Определим длину диаграммы в вершинах:
Подготовим данные для графиков и построим их:
Не забудем добавить событие закрытия окна:
Окончательный алгоритм:
Тесты
Переходим к главному – что же быстрее? Зеленым на графике обозначены lambda, красным — def.
Первый тест — на скорость создания пустой (почти) функции:
Второй тест — на скорость создания функции с выражением:
Третий тест — на скорость создания и выполнения:
Во всех случаях ведут lambda-функции.
Выводы
Для повышения читабельности в любом случае используйте def, ну а если скорость в приоритете — не используйте Python. Ну а если серьезно, то статья кому-то может оказаться полезной, ведь Python идеально подходит для некоторых задач, так почему-бы эти задачи не оптимизировать?
8К открытий8К показов