Python School
89.1K subscribers
2.14K photos
5 videos
537 links
Уроки по Python, которые упростят вам жизнь. Без идиотских туториалов.

Наши мемы для программистов: @conhum

Сотрудничество - @alivian

Канал сотрудничает с рекламным сервисом @Tgpodbor_official
Download Telegram
Эффективное использование метода __iand__(self, other)

Метод iand(self, other) в Python позволяет определить поведение оператора побитовой операции "и" с присваиванием (&=) для пользовательских классов. Этот метод полезен для выполнения битовых операций над данными, которые хранятся в пользовательских объектах.

Метод iand является специальным методом, который позволяет реализовать операцию побитового "и" с присваиванием. Когда оператор &= применяется к объекту, Python вызывает этот метод, позволяя изменить объект на месте в соответствии с результатом операции.

Использование метода iand позволяет легко реализовать операцию побитового "и" с присваиванием для пользовательских классов. Это делает код более чистым и удобным для чтения, а также улучшает производительность за счет изменения объектов на месте.
Эффективное использование метода ifloordiv(self, other)

Метод ifloordiv(self, other) в Python позволяет определить поведение оператора целочисленного деления с присваиванием (//=) для пользовательских классов. Это особенно полезно для работы с числовыми данными и структурами, где целочисленное деление и обновление значений являются обычными задачами.

Метод ifloordiv является специальным методом, который позволяет реализовать целочисленное деление с присваиванием. Когда оператор //= применяется к объекту, Python вызывает этот метод, позволяя изменить объект на месте в соответствии с результатом целочисленного деления.

Использование метода ifloordiv позволяет легко реализовать целочисленное деление с присваиванием для пользовательских классов. Это делает код более чистым и удобным для чтения, а также улучшает производительность за счет изменения объектов на месте.
Эффективное использование метода __imatmul__(self, other)

Метод imatmul(self, other) в Python позволяет определить поведение оператора матричного умножения с присваиванием (@=) для пользовательских классов. Это полезно для работы с матрицами и другими структурами данных, поддерживающими матричное умножение, делая код более выразительным и эффективным.

Метод imatmul — это специальный метод, который позволяет реализовать матричное умножение с присваиванием. Когда оператор @= применяется к объекту, Python вызывает этот метод, позволяя изменить объект на месте в соответствии с результатом матричного умножения.

Использование метода imatmul позволяет легко реализовать матричное умножение с присваиванием для пользовательских классов. Это делает код более чистым и удобным для чтения, а также улучшает производительность за счет изменения объектов на месте.
Реализация операции вычитания на месте для пользовательского класса

Метод isub в Python используется для реализации операции вычитания на месте (оператора -=). Этот метод позволяет изменять объект "на месте", что может быть полезно для оптимизации производительности и управления памятью.

Рассмотрим пример, в котором у нас есть класс, представляющий пользовательский список чисел. Мы хотим поддерживать операцию вычитания на месте как с обычными числами Python (int), так и с другими экземплярами нашего класса.

Этот лайфхак позволяет вашему классу поддерживать более гибкие и удобные операции вычитания на месте, что улучшает производительность и удобство использования, а также помогает избежать лишних копий данных.
Расширение возможности операции побитового исключающего "или" для пользовательских объектов

Метод rxor в Python используется для реализации операции побитового исключающего "или" (оператора ^), когда операнд слева не поддерживает соответствующий метод xor. Этот метод полезен для работы с пользовательскими объектами, когда требуется поддерживать операцию побитового исключающего "или" с различными типами данных.

Рассмотрим пример, в котором у нас есть класс, представляющий пользовательские битовые данные, и мы хотим поддерживать операцию побитового исключающего "или" как с обычными числами Python (int), так и с другими экземплярами нашего класса.

Этот лайфхак позволяет сделать ваш класс более универсальным и поддерживать операции побитового исключающего "или" с различными типами данных, что повышает его гибкость и удобство использования.
Сравнение быстродействия def и lambda-функций Python. Производные функции

Иными словами — функция второго уровня вложенности служит для многократного вызова и создания во время каждого функции третьего уровня вложенности.
Сравнение быстродействия def и lambda-функций Python. Производные функции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как видим этот метод работает быстрее.
Однострочный условный оператор (тернарный оператор)

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

Использование тернарного оператора позволяет упростить код, особенно когда нужно выполнить простое условие и присвоить значение одной переменной на основе этого условия.
Сравнение быстродействия def и lambda-функций Python. Производные функции

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

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

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

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

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