Python tricks | Хитрости Питона
5.88K subscribers
2.21K photos
26 videos
1 file
2.52K links
Здесь вы найдете лучшие практики и приёмы, которые используют опытные программисты.

Сотрудничество: @SIeep_Token

Мы на платформе: https://telegram.me/python_tricks

Ссылка на канал: https://t.me/+QayZf6ccsQllZTYy
Download Telegram
Сравнение быстродействия def и lambda-функций Python. Производные функции

Иными словами — функция второго уровня вложенности служит для многократного вызова и создания во время каждого функции третьего уровня вложенности.

🔗 Python tricks
Сравнение быстродействия def и lambda-функций Python. Производные функции

А производная для функции построения графика — это же самая функция с определенными аргументами.

Мы будем проверять скорость создания и скорость выполнения разного вида функций.

Вернёмся к первому. В случае проверки скорости создания функции, функция_для_замера() будет иметь одну цель — создать внутри себя def или lambda функцию. Её мы будем вызывать множество раз, и каждый раз она будет создавать одну и ту же функцию заново.

🔗 Python tricks
Сравнение быстродействия def и lambda-функций Python. Производные функции

Слабонервным людям, ненавидящим многоуровневые вложения, не читать.

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

🔗 Python tricks
sorted

Функция sorted() возвращает отсортированный список элементов из указанного итерируемого объекта. Она не изменяет исходный объект, а возвращает новый отсортированный список. По умолчанию сортировка происходит по возрастанию, но с помощью параметра reverse=True можно изменить направление на убывание.

🔗 Python tricks
math.fabs

math.fabs — это функция, которая возвращает абсолютное значение числа в виде числа с плавающей точкой. В отличие от встроенной функции abs, которая может возвращать целое или число с плавающей точкой в зависимости от типа входного значения, math.fabs всегда возвращает значение типа float.

🔗 Python tricks
Сравнение быстродействия def и lambda-функций Python. Функции для упрощения жизни

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

🔗 Python tricks
Сравнение быстродействия def и lambda-функций Python. Общие функции

Всего у нас будет 2 диаграммы: полная и усредненная. В каждой по 2 графика: для def и lambda функций. Всего нам потребуется 4 черепахи.
Список значений для 1 и 2 графика очевиден — несколько результатов выполнения замера скорости. С 3 и 4 всё сложнее — нужно найти среднее арифметическое одного из 2 первых графиков.

Дабы слишком не заморачиваться над тем, чтобы график никуда не вылезал, найдём разницу между каждым элементом каждого графика и средним значением между средними арифметическими из 1 и 2 графика. В итоге, на графике мы будем видеть не общее значение, а разницу.

🔗 Python tricks
Сравнение быстродействия def и lambda-функций Python. Общие функции

В нашем коде для измерения быстродействия нужна соответствующая функция. Она будет главной для всех производных. Прежде всего, мы будем измерять время выполнения не один раз — слишком велика погрешность. Функция будет принимать в аргументы функцию, для которой проводится замер, а также количество повторений этой функции.

Для самого измерения мы будем использовать разницу во времени между началом выполнения и концом.

🔗 Python tricks
Конкатенация строк

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

Более эффективный подход к решению этой задачи заключается в использовании функции join()

🔗 Python tricks
math.log1p

Функция math.log1p используется для вычисления значения натурального логарифма от 1 + x. Она особенно полезна, когда x близко к нулю, так как обеспечивает высокую точность и избегает потери значимости в младших разрядах, которая может происходить при использовании math.log(1 + x).

🔗 Python tricks
Настраиваемый логгер-декоратор

Начнем с примера использования. Так мы не перегружаем внимание внутренней сложностью и повышаем шансы создать удачный интерфейс модуля. На этом принципе основана разработка через тестирование — test-driven development (TTD).

У класса Logger есть метод log_msg(), который можно использовать напрямую внутри функций.

🔗 Python tricks
Анатомия декоратора в Python

Создадим декоратор @hello_decorator.

Декоратор в Python — функция, которая принимает функцию/класс и возвращает функцию/класс. В примере декоратор hello_decorator() принимает функцию f(), и возвращает функцию wrapper().

🔗 Python tricks
Сложение списков

Не всегда операторы в python ведут себя так, как мы привыкли. Например сложение списков.

Как видно, инструкция 28 в случае + простое сложение, а в случае += — сложение на месте, которое не приводит к созданию нового списка. += в данном случае сопоставим по производительности с list.extend.

🔗 Python tricks
Генераторные фунции

Если предикатов фильтрации или обработчиков элементов списка много, то удобнее использовать генераторы. Они могут не дать прироста скорости, но помогут сэкономить память.

Генераторной фунцией в python называется функция, которая ведет себя как итератор. Для определения генераторной функции нужно использовать ключевое слово yield.

🔗 Python tricks
Генераторные выражения

Попробуем использовать генераторные выражения (для получения среза будем использовать функцию islice из itertools, которая возвращает итератор по срезу)

Итог: увеличение производительности более чем в 3 раза.

🔗 Python tricks
math.erfc

Функция math.erfc используется в тех же областях, что и math.erf, но применяется чаще для вычислений вероятностей, связанных с нормальным распределением. Например, в статистике и теории вероятностей для вычисления вероятности того, что случайная величина из нормального распределения примет значение за пределами заданного диапазона.

🔗 Python tricks
Списковые включения

Python часто ругают за то, что он медленный. Однако в нем существует несколько подходов, которые позволяют писать достаточно быстрый код.

Например у нас есть большой список словарей (объявления контекстной рекламы). Зададим начальное время выборки и конечное.

И попробуем выбрать все объявления, ставка которых выше 600 и дата попадает в выбранный интервал. Затем возьмем первые 1000 элементов полученного списка.

Как видим этот метод работает быстрее.

🔗 Python tricks
Однострочный условный оператор (тернарный оператор)

В Python существует возможность использовать однострочный условный оператор, который позволяет сократить код и сделать его более лаконичным. Это особенно полезно для простых условий, которые можно выразить в одной строке.

Использование тернарного оператора позволяет упростить код, особенно когда нужно выполнить простое условие и присвоить значение одной переменной на основе этого условия.

🔗 Python tricks
Сравнение быстродействия def и lambda-функций Python. Производные функции

А производная для функции построения графика — это же самая функция с определенными аргументами.

Мы будем проверять скорость создания и скорость выполнения разного вида функций.

Вернёмся к первому. В случае проверки скорости создания функции, функция_для_замера() будет иметь одну цель — создать внутри себя def или lambda функцию. Её мы будем вызывать множество раз, и каждый раз она будет создавать одну и ту же функцию заново.

🔗 Python tricks
Использование enumerate для нумерации элементов в цикле

Функция enumerate в Python — это удобный способ получать одновременно индекс и значение элемента при итерации по последовательности. Она особенно полезна для тех, кто часто работает с циклами и списками, и позволяет сделать код более чистым и читабельным.

Использование enumerate упрощает обработку последовательностей, делая код более лаконичным и легким для понимания.

🔗 Python tricks
Переселения

Для простого написания перечисления в Python можно организовать с помощью класса Enum. Этот класс можно назвать удобным способом инкапсуляции списка констант, чтобы они не были разбросаны по всему коду без структуры.

🔗 Python tricks