Как оптимизировать память используя генераторы вместо списков
Когда мы работаем с большими наборами данных, важно помнить об эффективном использовании памяти. Одной из полезных фишек Python для оптимизации памяти является использование генераторов вместо списков.
Пример кода
Допустим, у нас есть задача найти квадраты чисел от 1 до 1 000 000. Сначала посмотрим, как это сделать с помощью списка:
Этот код создает список квадратов чисел, что требует значительного объема памяти. Вместо этого можно использовать генератор, который создаст объекты по мере их запроса, не занимая много памяти:
Теперь squares - это генератор, который генерирует квадраты чисел по мере необходимости, занимая минимальное количество памяти.
Почему это полезно
Использование генераторов вместо списков позволяет значительно экономить память, особенно при работе с большими наборами данных. Это делает ваш код более эффективным и позволяет работать с гораздо большими объемами данных без значительных затрат ресурсов.
#theory // Just Python
Когда мы работаем с большими наборами данных, важно помнить об эффективном использовании памяти. Одной из полезных фишек Python для оптимизации памяти является использование генераторов вместо списков.
Пример кода
Допустим, у нас есть задача найти квадраты чисел от 1 до 1 000 000. Сначала посмотрим, как это сделать с помощью списка:
# Плохая практика: использование списка
squares = [x**2 for x in range(1, 1000001)]
Этот код создает список квадратов чисел, что требует значительного объема памяти. Вместо этого можно использовать генератор, который создаст объекты по мере их запроса, не занимая много памяти:
# Лучшая практика: использование генератора
squares = (x**2 for x in range(1, 1000001))
Теперь squares - это генератор, который генерирует квадраты чисел по мере необходимости, занимая минимальное количество памяти.
Почему это полезно
Использование генераторов вместо списков позволяет значительно экономить память, особенно при работе с большими наборами данных. Это делает ваш код более эффективным и позволяет работать с гораздо большими объемами данных без значительных затрат ресурсов.
#theory // Just Python
Модуль dataclasses предназначен для упрощения создания классов данных.
Он предоставляет декоратор и набор инструментов, которые автоматически генерируют основные методы класса, такие как
В примере выше мы используем декоратор @dataclass, чтобы автоматически сгенерировать методы класса Point. Мы определяем поля x, y и z, которые представляют координаты точки. После создания экземпляра класса Point с помощью аргументов конструктора, мы можем напрямую выводить информациюreprтод
Подробнее здесь
#theory // Just Python
Он предоставляет декоратор и набор инструментов, которые автоматически генерируют основные методы класса, такие как
__init__()
, __repr__()
, __eq__()
, и другие. Это упрощает создание классов, которые служат простым хранилищем данных, без необходимости вручную определять все методыВ примере выше мы используем декоратор @dataclass, чтобы автоматически сгенерировать методы класса Point. Мы определяем поля x, y и z, которые представляют координаты точки. После создания экземпляра класса Point с помощью аргументов конструктора, мы можем напрямую выводить информациюreprтод
__repr__()
автоматически сгенерирован. Это делает код более лаконичным и удобным для использования.Подробнее здесь
#theory // Just Python
Создание видео из изображений
В этот раз мы сделаем скрипт для создания видео. Он будет объединять набор изображений в видеоролик, добавлять фоновую музыку, а также позволит настроить скорость смены кадров. В результате получится готовое MP4-видео!
Ссылка на код
#theory // Just Python
В этот раз мы сделаем скрипт для создания видео. Он будет объединять набор изображений в видеоролик, добавлять фоновую музыку, а также позволит настроить скорость смены кадров. В результате получится готовое MP4-видео!
Ссылка на код
#theory // Just Python
Как объединять цепочки условий красиво и читаемо
Иногда логика с множеством if становится громоздкой. В таких случаях удобно использовать словарь как аналог switch-case.
Итог:
Словарь заменяет кучу
#theory // Just Python
Иногда логика с множеством if становится громоздкой. В таких случаях удобно использовать словарь как аналог switch-case.
Итог:
Словарь заменяет кучу
if-elif-else
, делает код чище и облегчает добавление новых случаев. Особенно полезно, когда условия связаны с конкретными значениями (например, кодами, командами или ролями).#theory // Just Python
Как замерить время выполнения кода элегантно
Иногда нужно узнать, сколько времени занял блок кода — для отладки, оптимизации или просто интереса. Вместо громоздких решений можно использовать контекстный менеджер.
Итог:
Контекстный менеджер timeit позволяет быстро замерять производительность без лишнего шума. Особенно полезен при профилировании отдельных участков кода.
#theory // Just Python
Иногда нужно узнать, сколько времени занял блок кода — для отладки, оптимизации или просто интереса. Вместо громоздких решений можно использовать контекстный менеджер.
Итог:
Контекстный менеджер timeit позволяет быстро замерять производительность без лишнего шума. Особенно полезен при профилировании отдельных участков кода.
#theory // Just Python
Как элегантно объединять словари с приоритетом значений
Часто нужно объединить два словаря, где значения из второго имеют приоритет. Это можно сделать просто и читаемо.
Итог:
Синтаксис {dict1, dict2} объединяет словари, давая приоритет второму. Удобен для настройки конфигураций, параметров и всего, что связано с override'ами.
#theory // Just Python
Часто нужно объединить два словаря, где значения из второго имеют приоритет. Это можно сделать просто и читаемо.
Итог:
Синтаксис {dict1, dict2} объединяет словари, давая приоритет второму. Удобен для настройки конфигураций, параметров и всего, что связано с override'ами.
#theory // Just Python
Модуль Faker поможет создавать реалистичные тестовые данные.
Независимо от того, нужны ли вам данные для тестирования, заполнения базы данных или демонстрации функционала, Faker делает процесс генерации данных простым и эффективным.
Faker предоставляет генераторы для различных типов данных, таких как имена, адреса, номера телефонов, электронные почты, даты, текст и многое другое. Это идеальное решение для тех, кто хочет ускорить процесс тестирования.
На примере выше мы написали функцию generate_fake_user, которая использует различные методы Faker, чтобы создать случайные данные для имени, электронной почты, номера телефона и адреса. Затем мы выводим полученные данные о пользователе.
Ставится командой ⚙️
#theory // Just Python
Независимо от того, нужны ли вам данные для тестирования, заполнения базы данных или демонстрации функционала, Faker делает процесс генерации данных простым и эффективным.
Faker предоставляет генераторы для различных типов данных, таких как имена, адреса, номера телефонов, электронные почты, даты, текст и многое другое. Это идеальное решение для тех, кто хочет ускорить процесс тестирования.
На примере выше мы написали функцию generate_fake_user, которая использует различные методы Faker, чтобы создать случайные данные для имени, электронной почты, номера телефона и адреса. Затем мы выводим полученные данные о пользователе.
Ставится командой ⚙️
pip3 install faker
Документация и примеры кода здесь #theory // Just Python
Используйте функцию enumerate для перебора элементов списка и их индексов
enumerate - это встроенная функция, которая принимает список и возвращает объект, который можно использовать в цикле for для перебора элементов списка и их соответствующих индексов.
#theory // Just Python
enumerate - это встроенная функция, которая принимает список и возвращает объект, который можно использовать в цикле for для перебора элементов списка и их соответствующих индексов.
#theory // Just Python
Ограничение времени выполнения кода с signal
Когда нужно завершать долгие операции (например, при парсинге или работе с API), полезно уметь ставить таймаут на блок кода.
Итог:
Модуль signal позволяет элегантно ограничивать время выполнения операций. Особенно полезен при работе с нестабильными внешними источниками или написании защищённых CLI-утилит. Работает только в UNIX-системах.
#theory // Just Python
Когда нужно завершать долгие операции (например, при парсинге или работе с API), полезно уметь ставить таймаут на блок кода.
Итог:
Модуль signal позволяет элегантно ограничивать время выполнения операций. Особенно полезен при работе с нестабильными внешними источниками или написании защищённых CLI-утилит. Работает только в UNIX-системах.
#theory // Just Python
Автоматический резюме-аналитик
Данная программа позволяет загружать .pdf или .docx файл с резюме, извлекает ключевые навыки, опыт, контакты, и формирует краткий отчет. В результате можно разобрать резюме без ручного чтения – отличный инструмент для HR, рекрутеров или разработчиков.
Ссылка на код
#theory // Just Python
Данная программа позволяет загружать .pdf или .docx файл с резюме, извлекает ключевые навыки, опыт, контакты, и формирует краткий отчет. В результате можно разобрать резюме без ручного чтения – отличный инструмент для HR, рекрутеров или разработчиков.
Ссылка на код
#theory // Just Python
Глубокая заморозка объектов с types.MappingProxyType
Иногда нужно создать словарь, который нельзя изменить — например, для констант или конфигурации. Вместо копирования или заморозки вручную, можно использовать MappingProxyType.
Итог:
MappingProxyType создаёт читаемую, но неизменяемую обёртку над словарём — отличный способ защитить данные от случайного изменения, особенно в конфигурациях и API-интерфейсах.
#theory // Just Python
Иногда нужно создать словарь, который нельзя изменить — например, для констант или конфигурации. Вместо копирования или заморозки вручную, можно использовать MappingProxyType.
Итог:
MappingProxyType создаёт читаемую, но неизменяемую обёртку над словарём — отличный способ защитить данные от случайного изменения, особенно в конфигурациях и API-интерфейсах.
#theory // Just Python
PrettyTable – это Python-модуль, который облегчает создание таблиц в коде. На его основе можно легко создавать таблицы из результатов запросов или из любых других данных. Библиотека была разработана Дайвом Льюисом и имеет удобный и понятный синтаксис, который позволяет создавать с помощью пары строк кода красивые таблицы.
PrettyTable позволяет форматировать таблицы, выравнивать данные, добавлять заголовки и многое другое. Это делает эту библиотеку полезным инструментом для анализа, презентации и отображения данных на экране.
PrettyTable позволяет очень просто и быстро настраивать таблицы в Python. Библиотека отлично подходит для работы с большим объемом данных, которые необходимо представить в удобочитаемом формате. Она позволяет легко форматировать таблицы и менять их визуальное отображение.
Ставится командой ⚙️
Документация и примеры кода здесь
#theory // Just Python
PrettyTable позволяет форматировать таблицы, выравнивать данные, добавлять заголовки и многое другое. Это делает эту библиотеку полезным инструментом для анализа, презентации и отображения данных на экране.
PrettyTable позволяет очень просто и быстро настраивать таблицы в Python. Библиотека отлично подходит для работы с большим объемом данных, которые необходимо представить в удобочитаемом формате. Она позволяет легко форматировать таблицы и менять их визуальное отображение.
Ставится командой ⚙️
pip install prettytable
Документация и примеры кода здесь
#theory // Just Python
Замер времени выполнения кода с timeit
Иногда нужно быстро понять, насколько эффективно работает участок кода. Вместо ручного замера времени можно использовать модуль timeit, который делает это корректно и точно.
timeit учитывает накладные расходы, прогрев интерпретатора и выполняет код в изолированной среде, что делает его отличным инструментом для микробенчмарков.
Итог:
timeit — отличный способ сравнивать производительность разных решений и выбирать самое быстрое.
#theory // Just Python
Иногда нужно быстро понять, насколько эффективно работает участок кода. Вместо ручного замера времени можно использовать модуль timeit, который делает это корректно и точно.
timeit учитывает накладные расходы, прогрев интерпретатора и выполняет код в изолированной среде, что делает его отличным инструментом для микробенчмарков.
Итог:
timeit — отличный способ сравнивать производительность разных решений и выбирать самое быстрое.
#theory // Just Python
Тайминг кода без сторонних библиотек
Нужно быстро узнать, сколько времени занимает выполнение участка кода? Воспользуйтесь встроенным модулем time.
Итог:
С помощью
#theory // Just Python
Нужно быстро узнать, сколько времени занимает выполнение участка кода? Воспользуйтесь встроенным модулем time.
time.perf_counter()
предоставляет наиболее точные замеры времени исполнения — идеально для бенчмаркинга.Итог:
С помощью
time.perf_counter()
можно легко измерять производительность кода без внешних зависимостей.#theory // Just Python
Словарь с "молчаливыми" значениями — defaultdict
Когда работаешь со словарём, часто нужно сначала проверять, есть ли ключ. С defaultdict от collections это делается автоматически.
Итог:
defaultdict избавляет от лишних проверок и упрощает код, особенно когда нужно агрегировать или группировать данные.
#theory // Just Python
Когда работаешь со словарём, часто нужно сначала проверять, есть ли ключ. С defaultdict от collections это делается автоматически.
Итог:
defaultdict избавляет от лишних проверок и упрощает код, особенно когда нужно агрегировать или группировать данные.
#theory // Just Python
Как красиво подставлять переменные в строку?
Новички часто используют конкатенацию (+) или .format() для создания строк с переменными, но это может быть громоздко и неудобно. Python предлагает современный и удобный способ — f-строки (форматированные строки), которые позволяют подставлять значения прямо внутрь строки с минимальным синтаксисом.
Для этого перед строкой нужно поставить f, а переменные — обернуть в фигурные скобки {}.
Итог:
f-строки — простой и читаемый способ форматирования.
Позволяют вставлять выражения прямо в строку.
Быстрее и удобнее, чем .format() или +.
#theory // Just Python
Новички часто используют конкатенацию (+) или .format() для создания строк с переменными, но это может быть громоздко и неудобно. Python предлагает современный и удобный способ — f-строки (форматированные строки), которые позволяют подставлять значения прямо внутрь строки с минимальным синтаксисом.
Для этого перед строкой нужно поставить f, а переменные — обернуть в фигурные скобки {}.
Итог:
f-строки — простой и читаемый способ форматирования.
Позволяют вставлять выражения прямо в строку.
Быстрее и удобнее, чем .format() или +.
#theory // Just Python
Как узнать, есть ли элемент в списке?
Иногда нужно проверить, содержится ли элемент в списке. Новички могут использовать циклы, но Python предлагает более быстрый способ — оператор in.
Этот приём позволяет проверить наличие элемента за одну строку: "item" in list1 возвращает True, если элемент есть в списке, и False, если нет.
Итог:
Проверка за одну строку.
Читается как обычное предложение.
Работает мгновенно!
#theory // Just Python
Иногда нужно проверить, содержится ли элемент в списке. Новички могут использовать циклы, но Python предлагает более быстрый способ — оператор in.
Этот приём позволяет проверить наличие элемента за одну строку: "item" in list1 возвращает True, если элемент есть в списке, и False, если нет.
Итог:
Проверка за одну строку.
Читается как обычное предложение.
Работает мгновенно!
#theory // Just Python
Проверка аргументов функций — assert как мини-валидация
Иногда нужно быстро проверить корректность аргументов функции. Можно использовать assert для встроенной валидации прямо в начале.
Итог:
assert — быстрый способ «подстелить соломку» и отлавливать очевидные ошибки ещё до выполнения основного тела функции. Особенно полезно в прототипах и тестах.
#theory // Just Python
Иногда нужно быстро проверить корректность аргументов функции. Можно использовать assert для встроенной валидации прямо в начале.
Итог:
assert — быстрый способ «подстелить соломку» и отлавливать очевидные ошибки ещё до выполнения основного тела функции. Особенно полезно в прототипах и тестах.
#theory // Just Python
Безопасное закрытие ресурсов с contextlib.suppress
Иногда нужно проигнорировать конкретные ошибки, не загромождая код try/except-блоками. contextlib.suppress делает это изящно.
Итог:
#theory // Just Python
Иногда нужно проигнорировать конкретные ошибки, не загромождая код try/except-блоками. contextlib.suppress делает это изящно.
Итог:
contextlib.suppress
помогает лаконично и безопасно игнорировать конкретные исключения, не засоряя код лишней обработкой.#theory // Just Python