Оптимизация кода с помощью генераторов в Python
Сегодня хочу показать вам, как использование генераторов может сделать ваш код быстрее, экономнее по памяти и элегантнее.
Что такое генераторы?
Генераторы — это функции, которые используют
Пример: экономия памяти
Допустим, нам нужно обработать миллион чисел и взять из них только четные. Обычный способ:
Такой код загружает в память весь список, что может быть проблемой при больших данных.
А теперь переделаем на генератор:
Здесь список не создается, а элементы выдаются по одному. Это экономит память и ускоряет обработку!
Где применять?
✔️ Чтение больших файлов построчно (
✔️ Работа с потоками данных
✔️ Генерация последовательностей без создания списков
👉@BookPython
Сегодня хочу показать вам, как использование генераторов может сделать ваш код быстрее, экономнее по памяти и элегантнее.
Что такое генераторы?
Генераторы — это функции, которые используют
yield
вместо return
. Они не возвращают сразу все значения, а запоминают своё состояние и отдают результат по мере необходимости. Это особенно полезно при обработке больших объемов данных, так как позволяет не загружать всю информацию в память сразу. Пример: экономия памяти
Допустим, нам нужно обработать миллион чисел и взять из них только четные. Обычный способ:
def get_even_numbers(n):
result = []
for i in range(n):
if i % 2 == 0:
result.append(i)
return result
numbers = get_even_numbers(10**6)
print(len(numbers)) # 500000
Такой код загружает в память весь список, что может быть проблемой при больших данных.
А теперь переделаем на генератор:
def get_even_numbers_gen(n):
for i in range(n):
if i % 2 == 0:
yield i
numbers = get_even_numbers_gen(10**6)
print(sum(1 for _ in numbers)) # 500000
Здесь список не создается, а элементы выдаются по одному. Это экономит память и ускоряет обработку!
Где применять?
✔️ Чтение больших файлов построчно (
yield line
) ✔️ Работа с потоками данных
✔️ Генерация последовательностей без создания списков
👉@BookPython
Оптимизация SQL-запросов в Django ORM
Сегодня я покажу вам, как оптимизировать SQL-запросы в Django ORM, чтобы ваш код работал быстрее и эффективнее. Если ваш Django-проект начал тормозить, скорее всего, проблема в количестве и сложности запросов к базе данных.
1️⃣ Используйте
Django ORM лениво загружает связанные объекты, что может привести к множественным SQL-запросам (N+1). Вместо этого используйте:
Это значительно уменьшает количество запросов к базе.
2️⃣ Используйте
Если вам не нужны все поля модели, загружайте только необходимые:
А если хотите исключить несколько полей:
3️⃣ Агрегация вместо перебора в Python
Вместо:
Используйте
Это выполнится на стороне базы, а не в Python, что намного быстрее.
4️⃣ Используйте
Если вам нужно проверить, есть ли записи в базе, не используйте
❌ Плохо:
5️⃣ Кешируйте запросы
Django поддерживает кеширование, и если запросы повторяются, можно использовать:
Эти простые приемы помогут вам ускорить Django-приложение и уменьшить нагрузку на базу данных. А вы уже используете их в своих проектах? Делитесь в комментариях! 👇
👉@BookPython
Сегодня я покажу вам, как оптимизировать SQL-запросы в Django ORM, чтобы ваш код работал быстрее и эффективнее. Если ваш Django-проект начал тормозить, скорее всего, проблема в количестве и сложности запросов к базе данных.
1️⃣ Используйте
select_related
и prefetch_related
Django ORM лениво загружает связанные объекты, что может привести к множественным SQL-запросам (N+1). Вместо этого используйте:
# select_related — жадная загрузка (для ForeignKey, OneToOne)
posts = Post.objects.select_related("author").all()
# prefetch_related — для ManyToMany и Reverse ForeignKey
posts = Post.objects.prefetch_related("comments").all()
Это значительно уменьшает количество запросов к базе.
2️⃣ Используйте
only
и defer
Если вам не нужны все поля модели, загружайте только необходимые:
users = User.objects.only("id", "username") # Загружаем только ID и имя
А если хотите исключить несколько полей:
users = User.objects.defer("bio", "last_login") # Исключаем ненужные поля
3️⃣ Агрегация вместо перебора в Python
Вместо:
total_likes = sum(post.likes.count() for post in posts)
Используйте
annotate
:
from django.db.models import Count
posts = Post.objects.annotate(total_likes=Count("likes"))
Это выполнится на стороне базы, а не в Python, что намного быстрее.
4️⃣ Используйте
exists()
вместо count()
Если вам нужно проверить, есть ли записи в базе, не используйте
count()
, это дорогостоящий запрос:
if User.objects.filter(email="test@example.com").exists(): # Быстро
❌ Плохо:
if User.objects.filter(email="test@example.com").count() > 0: # Долго
5️⃣ Кешируйте запросы
Django поддерживает кеширование, и если запросы повторяются, можно использовать:
from django.core.cache import cache
users = cache.get("users")
if not users:
users = list(User.objects.all()) # Загружаем пользователей
cache.set("users", users, timeout=60 * 15) # Кешируем на 15 минут
Эти простые приемы помогут вам ускорить Django-приложение и уменьшить нагрузку на базу данных. А вы уже используете их в своих проектах? Делитесь в комментариях! 👇
👉@BookPython
Многие системные вызовы могут быть прерваны входящим сигналом. Если программист хочет, чтобы вызов всё же был выполнен, ему нужно повторить его снова.
Яркий пример — функция
Однако, начиная с Python 3.5, благодаря PEP 475, Python автоматически обрабатывает все такие вызовы. Следующая программа завершится при первом полученном
👉@BookPython
Яркий пример — функция
sleep(x)
, которая должна "заморозить" программу на x
секунд, но на практике может завершиться раньше, если появится сигнал.Однако, начиная с Python 3.5, благодаря PEP 475, Python автоматически обрабатывает все такие вызовы. Следующая программа завершится при первом полученном
SIGINT
в любой версии Python до 3.5. Но в Python 3.5+ она будет спать ровно 5 секунд, независимо от сигналов.
import signal
import time
def signal_handler(signal, frame):
print('Caught')
signal.signal(signal.SIGINT, signal_handler)
time.sleep(5)
👉@BookPython
Вот отсортированная база с тонной материала (постепенно пополняется):
БАЗА (4687 видео/книг):
(363 видео, 87 книги) — Python
(415 видео, 68 книги) — Frontend
(143 видео, 33 книги) — ИБ/Хакинг
(352 видео, 89 книги) — С/С++
(343 видео, 87 книги) — Java
(176 видео, 32 книги) — Git
(293 видео, 63 книги) — C#
(174 видео, 91 книги) — DevOps
(167 видео, 53 книги) — PHP
(227 видео, 83 книги) — SQL/БД
(163 видео, 29 книги) — Linux
(114 видео, 77 книги) — Сисадмин
(107 видео, 43 книги) — BA/SA
(181 видео, 32 книги) — Go
(167 видео, 43 книги) — Kotlin/Swift
(112 видео, 24 книги) — Flutter
(137 видео, 93 книги) — DS/ML
(113 видео, 82 книги) — GameDev
(183 видео, 37 книги) — Дизайн
(129 видео, 73 книги) — QA
(213 видео, 63 книги) — Rust
(121 видео, 24 книги) — 1С
(136 видео, 33 книги) — PM/HR
Скачивать ничего не нужно — все выложили в Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
Списковые включения (list comprehensions) могут содержать несколько операторов
Можно также добавлять условия
Любое выражение с
Вы можете комбинировать
👉@BookPython
for
и if
:
In : [(x, y) for x in range(3) for y in range(3)]
Out: [
(0, 0), (0, 1), (0, 2),
(1, 0), (1, 1), (1, 2),
(2, 0), (2, 1), (2, 2)
]
Можно также добавлять условия
if
для фильтрации значений:
In : [
(x, y)
for x in range(3)
for y in range(3)
if x != 0
if y != 0
]
Out: [(1, 1), (1, 2), (2, 1), (2, 2)]
Любое выражение с
for
и if
может использовать все переменные, определённые ранее:
In : [
(x, y)
for x in range(3)
for y in range(x + 2)
if x != y
]
Out: [
(0, 1),
(1, 0), (1, 2),
(2, 0), (2, 1), (2, 3)
]
Вы можете комбинировать
for
и if
в любом порядке:
In : [
(x, y)
for x in range(5)
if x % 2
for y in range(x + 2)
if x != y
]
Out: [
(1, 0), (1, 2),
(3, 0), (3, 1), (3, 2), (3, 4)
]
👉@BookPython
Как ускорить Python-код в 5 раз без Cython и Numba? 🚀
Сегодня я покажу вам, как можно ускорить выполнение Python-кода в 5 раз, не прибегая к сложным инструментам типа Cython или Numba. Всё, что нам понадобится, – это грамотная работа с
Проблема:
Допустим, у нас есть функция, которая выполняет вычисления для каждого элемента списка:
Этот код выполняется 5 секунд, потому что вычисления идут последовательно.
Решение:
Используем
Теперь код выполняется всего 1 секунду! 🎉
✅ Python автоматически распределяет вычисления по ядрам процессора
✅ Код остаётся читаемым и простым
✅ Работает во всех системах (но в Windows нужен
Итоги:
- Используйте
- Это легко и быстро внедряется в существующий код
- Безопасный способ ускорения без Cython и Numba
А какие ещё способы ускорения Python-кода вы знаете? Делитесь в комментариях! 👇
👉 @BookPython
Сегодня я покажу вам, как можно ускорить выполнение Python-кода в 5 раз, не прибегая к сложным инструментам типа Cython или Numba. Всё, что нам понадобится, – это грамотная работа с
multiprocessing
.Проблема:
Допустим, у нас есть функция, которая выполняет вычисления для каждого элемента списка:
import time
def slow_function(x):
time.sleep(1) # Симуляция долгих вычислений
return x * x
data = [1, 2, 3, 4, 5]
results = [slow_function(x) for x in data]
print(results)
Этот код выполняется 5 секунд, потому что вычисления идут последовательно.
Решение:
multiprocessing.Pool
Используем
multiprocessing
, чтобы запустить вычисления параллельно:
from multiprocessing import Pool
with Pool() as pool:
results = pool.map(slow_function, data)
print(results)
Теперь код выполняется всего 1 секунду! 🎉
✅ Python автоматически распределяет вычисления по ядрам процессора
✅ Код остаётся читаемым и простым
✅ Работает во всех системах (но в Windows нужен
if name == "__main__"
)Итоги:
- Используйте
multiprocessing.Pool
для CPU-интенсивных задач- Это легко и быстро внедряется в существующий код
- Безопасный способ ускорения без Cython и Numba
А какие ещё способы ускорения Python-кода вы знаете? Делитесь в комментариях! 👇
👉 @BookPython
🐍 Как улучшить читаемость кода в Python?
Читаемый код — это не роскошь, а необходимость. Если ваш код трудно понять, даже если он работает, это плохой код. Сегодня разберем несколько простых, но мощных приемов, которые сделают ваш код более понятным.
1️⃣ Используйте говорящие имена переменных
Плохой пример:
Хороший пример:
Теперь сразу понятно, что делает код!
2️⃣ Разбивайте код на функции
Вместо длинных кусков кода, используйте функции:
Теперь код можно переиспользовать и проще тестировать.
3️⃣ Следуйте PEP 8
Форматирование кода влияет на его читаемость. Например, пробелы вокруг операторов делают код более понятным:
Пользуйтесь
4️⃣ Избегайте магических чисел
Если в коде встречаются непонятные числа, лучше заменить их на константы:
5️⃣ Используйте list comprehensions
Вместо:
Лучше:
Чище и лаконичнее!
Читаемый код делает разработку приятнее, ускоряет исправление багов и упрощает поддержку. Напишите в комментариях, какие еще приемы вы используете для улучшения читаемости кода! 👇
👉 @BookPython
Читаемый код — это не роскошь, а необходимость. Если ваш код трудно понять, даже если он работает, это плохой код. Сегодня разберем несколько простых, но мощных приемов, которые сделают ваш код более понятным.
1️⃣ Используйте говорящие имена переменных
Плохой пример:
a = 10
b = 20
c = a + b
Хороший пример:
price = 10
tax = 20
total_cost = price + tax
Теперь сразу понятно, что делает код!
2️⃣ Разбивайте код на функции
Вместо длинных кусков кода, используйте функции:
def calculate_total(price, tax):
return price + tax
total_cost = calculate_total(10, 20)
Теперь код можно переиспользовать и проще тестировать.
3️⃣ Следуйте PEP 8
Форматирование кода влияет на его читаемость. Например, пробелы вокруг операторов делают код более понятным:
# Плохо
total=price+tax
# Хорошо
total = price + tax
Пользуйтесь
black
или flake8
, чтобы следить за стилем.4️⃣ Избегайте магических чисел
Если в коде встречаются непонятные числа, лучше заменить их на константы:
# Плохо
if age > 18:
print("Взрослый")
# Хорошо
LEGAL_AGE = 18
if age > LEGAL_AGE:
print("Взрослый")
5️⃣ Используйте list comprehensions
Вместо:
numbers = [1, 2, 3, 4, 5]
squared_numbers = []
for num in numbers:
squared_numbers.append(num ** 2)
Лучше:
squared_numbers = [num ** 2 for num in numbers]
Чище и лаконичнее!
Читаемый код делает разработку приятнее, ускоряет исправление багов и упрощает поддержку. Напишите в комментариях, какие еще приемы вы используете для улучшения читаемости кода! 👇
👉 @BookPython
Подборка Telegram каналов для программистов
https://t.me/lifeproger Жизнь программиста. Авторский канал.
https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://t.me/rabota1C_rus 1С Работа
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/linux_odmin Linux: Системный администратор
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
https://t.me/lifeproger Жизнь программиста. Авторский канал.
https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://t.me/rabota1C_rus 1С Работа
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/linux_odmin Linux: Системный администратор
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Если
Но можно сделать это более элегантно с помощью
Метод
👉@BookPython
'port'
нет в config
, устанавливаем его значение по умолчанию:
if 'port' not in config:
config['port'] = 80
port = config['port']
Но можно сделать это более элегантно с помощью
setdefault
:
port = config.setdefault('port', 80)
Метод
setdefault
устанавливает новое значение, если оно ещё не задано, и возвращает сохранённое значение вне зависимости от того, было ли оно изменено:
In : config = {}
In : config.setdefault('port', 80)
Out: 80
In : config.setdefault('port', 443)
Out: 80
👉@BookPython
📌 Декораторы в Python: как они работают и зачем нужны?
Сегодня я покажу вам, как работают декораторы в Python и зачем они вообще нужны.
Декораторы позволяют изменять поведение функций без изменения их кода. Они широко применяются в логировании, кешировании, управлении доступом и многом другом.
Допустим, у нас есть функция, которая просто выводит «Hello, world!»:
Теперь мы хотим, чтобы перед выполнением этой функции выполнялся какой-то код, например, логирование. Вместо изменения
И теперь используем его:
👉 Вывод:
Как это работает?
1. Декоратор принимает функцию (`func`) в качестве аргумента.
2. Внутри создаётся вложенная функция
3.
Можно даже передавать аргументы в декорируемую функцию:
👉 Вывод:
🔥 Декораторы — мощный инструмент, который делает код чище и удобнее. Если ещё не использовали их в проектах, самое время попробовать!
А какие декораторы вы используете в своих проектах? Делитесь в комментариях! ⬇️
👉@BookPython
Сегодня я покажу вам, как работают декораторы в Python и зачем они вообще нужны.
Декораторы позволяют изменять поведение функций без изменения их кода. Они широко применяются в логировании, кешировании, управлении доступом и многом другом.
Допустим, у нас есть функция, которая просто выводит «Hello, world!»:
def greet():
print("Hello, world!")
Теперь мы хотим, чтобы перед выполнением этой функции выполнялся какой-то код, например, логирование. Вместо изменения
greet()
, мы создадим декоратор:
def log_decorator(func):
def wrapper():
print(f"Вызов функции {func.__name__}")
return func()
return wrapper
И теперь используем его:
@log_decorator
def greet():
print("Hello, world!")
greet()
👉 Вывод:
Вызов функции greet
Hello, world!
Как это работает?
1. Декоратор принимает функцию (`func`) в качестве аргумента.
2. Внутри создаётся вложенная функция
wrapper()
, которая выполняет дополнительную логику перед вызовом func()
.3.
wrapper()
возвращается вместо func
, фактически подменяя её.Можно даже передавать аргументы в декорируемую функцию:
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Вызов {func.__name__} с аргументами: {args}, {kwargs}")
return func(*args, **kwargs)
return wrapper
@log_decorator
def add(a, b):
return a + b
print(add(3, 5))
👉 Вывод:
Вызов add с аргументами: (3, 5), {}
8
🔥 Декораторы — мощный инструмент, который делает код чище и удобнее. Если ещё не использовали их в проектах, самое время попробовать!
А какие декораторы вы используете в своих проектах? Делитесь в комментариях! ⬇️
👉@BookPython
Есть две встроенные функции, которые позволяют анализировать итерируемые объекты без написания тривиальных и избыточных условий
-
-
-
Обе функции особенно полезны при использовании вместе с генераторами и списковыми включениями:
Функции
👉@BookPython
if
. Это all
и any
.-
any
возвращает True
, если хотя бы одно из значений истинно. -
all
возвращает True
, если все значения истинны. -
all
возвращает True
для пустого итерируемого объекта, тогда как any
в этом случае вернёт False
.Обе функции особенно полезны при использовании вместе с генераторами и списковыми включениями:
package_broken = any(
part.is_broken() for part in package.get_parts()
)
package_ok = all(
part.ok() for part in package.get_parts()
)
Функции
any
и all
зачастую взаимозаменяемы благодаря законам де Моргана. Выбирайте ту, которая делает код более понятным.👉@BookPython
🔥 5 полезных инструментов для Python-разработчика
Сегодня покажу вам 5 инструментов, которые могут серьезно упростить жизнь Python-разработчика. Они не на слуху, но реально полезны! 🚀
1️⃣ Rich – Красивый вывод в консоли
Больше не нужно мучиться с
📌 Установка:
2️⃣ IceCream – Удобный отладочный принт
Если вы устали писать
📌 Установка:
3️⃣ Pydantic – Валидация данных без боли
Больше не нужно вручную проверять типы и структуру входных данных.
📌 Установка:
4️⃣ Typer – Быстрое создание CLI
Хотите создать CLI-приложение, но не любите
📌 Установка:
5️⃣ loguru – Логирование без боли
Более мощная альтернатива стандартному
📌 Установка:
Какими инструментами пользуетесь вы? Делитесь в комментариях! ⬇
👉 @BookPython
Сегодня покажу вам 5 инструментов, которые могут серьезно упростить жизнь Python-разработчика. Они не на слуху, но реально полезны! 🚀
1️⃣ Rich – Красивый вывод в консоли
Больше не нужно мучиться с
print()
, когда надо отобразить таблицу, JSON или логи с цветами. Rich
делает консольные приложения красивыми!
from rich import print
print({"name": "Alice", "age": 25})
📌 Установка:
pip install rich
2️⃣ IceCream – Удобный отладочный принт
Если вы устали писать
print(f"var={var}")
, попробуйте icecream
(ic
). Он показывает и имя переменной, и её значение, и даже место вызова!
from icecream import ic
x = 42
ic(x) # x: 42
📌 Установка:
pip install icecream
3️⃣ Pydantic – Валидация данных без боли
Больше не нужно вручную проверять типы и структуру входных данных.
Pydantic
делает это автоматически.
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
user = User(name="Alice", age="25") # ❌ Ошибка, age должен быть int
📌 Установка:
pip install pydantic
4️⃣ Typer – Быстрое создание CLI
Хотите создать CLI-приложение, но не любите
argparse
? Typer
использует аннотации типов и делает это проще.
import typer
def main(name: str):
print(f"Hello {name}!")
if __name__ == "__main__":
typer.run(main)
📌 Установка:
pip install typer
5️⃣ loguru – Логирование без боли
Более мощная альтернатива стандартному
logging
, с удобным API и красивым выводом.
from loguru import logger
logger.info("Это информационное сообщение!")
📌 Установка:
pip install loguru
Какими инструментами пользуетесь вы? Делитесь в комментариях! ⬇
👉 @BookPython
В Python можно спутать две вещи: итерируемые объекты (iterables) и итераторы (iterators).
Итерируемые объекты — это объекты, которые можно перебирать, то есть из них можно извлекать значения по одному, возможно, бесконечно. Обычно итерируемыми объектами являются коллекции, такие как массивы, множества, списки и т. д.
Есть два способа сделать объект итерируемым. Первый — реализовать метод
Вывод:
Второй способ — определить метод
Вывод:
Обычно итератор также имеет метод
👉@BookPython
Итерируемые объекты — это объекты, которые можно перебирать, то есть из них можно извлекать значения по одному, возможно, бесконечно. Обычно итерируемыми объектами являются коллекции, такие как массивы, множества, списки и т. д.
Есть два способа сделать объект итерируемым. Первый — реализовать метод
__getitem__
:
class Iterable:
def __getitem__(self, i):
if i > 10:
raise IndexError
return i
print(list(Iterable()))
Вывод:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Второй способ — определить метод
__iter__
, который возвращает итератор. Итератор — это объект, имеющий метод __next__
, который при каждом вызове возвращает следующее значение из исходного итерируемого объекта:
class Iterator:
def __init__(self):
self._i = 0
def __next__(self):
i = self._i
if i > 10:
raise StopIteration
self._i += 1
return i
class Iterable:
def __iter__(self):
return Iterator()
print(list(Iterable()))
Вывод:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Обычно итератор также имеет метод
__iter__
, который просто возвращает self
. Это позволяет самому итератору быть итерируемым, то есть большинство итераторов также являются итерируемыми объектами.👉@BookPython
Обычно вам не нужно заботиться об объектах-итераторах; они создаются и используются автоматически конструкциями
Забавный факт:
Обычно это удобно для чтения строк до появления определённого маркера:
👉@BookPython
for
, list
или другими механизмами, которые выполняют итерацию за вас. Однако в некоторых редких случаях вам может понадобиться получить итератор из итерируемого объекта явно. Правильный способ сделать это — использовать встроенную функцию iter
(которая использует методы __iter__
или __getitem__
объекта для получения итератора):
part_sizes = [3, 2, 5]
iterator = iter(range(100))
result = []
for size in part_sizes:
part = []
for _ in range(size):
part.append(next(iterator))
result.append(part)
assert result == [
[0, 1, 2],
[3, 4],
[5, 6, 7, 8, 9],
]
Забавный факт:
iter
можно использовать совершенно другим способом. Вместо создания итератора из объекта, он также может создавать итератор из функции (или любого вызываемого объекта). Если вызвать iter
с двумя аргументами, первый должен быть вызываемым объектом, а второй — контрольным значением (sentinel). При каждом вызове __next__
созданный итератор будет вызывать переданную функцию без аргументов. Если возвращённое значение равно sentinel
, возбуждается исключение StopIteration
; в противном случае возвращается полученное значение.Обычно это удобно для чтения строк до появления определённого маркера:
In : list(iter(input, 'END'))
a
b
END
Out: ['a', 'b', '']
👉@BookPython
🐍 Как ускорить работу с
Сегодня я покажу вам несколько способов ускорить работу с
1️⃣ Используйте
Если у вас есть столбцы с повторяющимися строковыми значениями (например, категории товаров), лучше преобразовать их в
Это снизит использование памяти и ускорит фильтрацию.
2️⃣ Читайте файлы быстрее
Стандартный
- Указать
- Использовать
- Применить
3️⃣ Используйте
Если у вас есть сложные вычисления, попробуйте
Это ускорит обработку в разы!
4️⃣
Если у вас мощный многопоточный процессор, попробуйте
Этот модуль использует все ядра процессора и ускоряет вычисления.
Какие еще трюки используете вы? Делитесь в комментариях!
👉@BookPython
pandas
? Сегодня я покажу вам несколько способов ускорить работу с
pandas
, если у вас большие объемы данных. 1️⃣ Используйте
categorical
тип данных Если у вас есть столбцы с повторяющимися строковыми значениями (например, категории товаров), лучше преобразовать их в
category
:
df["category"] = df["category"].astype("category")
Это снизит использование памяти и ускорит фильтрацию.
2️⃣ Читайте файлы быстрее
Стандартный
pandas.read_csv()
не всегда работает быстро. Можно попробовать: - Указать
dtype
столбцов - Использовать
usecols
для загрузки только нужных колонок - Применить
pyarrow
или fastparquet
при работе с Parquet-файлами
df = pd.read_csv("data.csv", dtype={"id": "int32", "name": "category"}, usecols=["id", "name"])
3️⃣ Используйте
numba
и vectorize()
Если у вас есть сложные вычисления, попробуйте
numba
:
from numba import jit
@jit(nopython=True)
def expensive_function(x):
return x**2 + 10*x + 5
df["new_col"] = df["value"].apply(expensive_function)
Это ускорит обработку в разы!
4️⃣
modin
вместо pandas
Если у вас мощный многопоточный процессор, попробуйте
modin
:
import modin.pandas as pd
df = pd.read_csv("data.csv")
Этот модуль использует все ядра процессора и ускоряет вычисления.
Какие еще трюки используете вы? Делитесь в комментариях!
👉@BookPython
В Python каждое значение имеет логическое (булево) представление. Оно неявно приводится к
Ложными (
Можно также определить пользовательскую проверку логического значения для своих объектов, используя магический метод
Обратите внимание, что в Python 2 аналогом
👉@BookPython
bool
, когда используется в if
, bool
, not
и других логических операциях.Ложными (
False
) считаются следующие объекты: None
, False
, 0
любого типа, а также пустые коллекции (""
, []
, {}
и т. д.), включая пользовательские коллекции с методом __len__
, если __len__
возвращает 0
.Можно также определить пользовательскую проверку логического значения для своих объектов, используя магический метод
__bool__
:
class Rectangle:
def __init__(self, width, height):
self._w = width
self._h = height
def __bool__(self):
return bool(self._w and self._h)
print(bool(Rectangle(2, 3))) # True
print(bool(Rectangle(2, 0))) # False
print(bool(Rectangle(0, 2))) # False
Обратите внимание, что в Python 2 аналогом
__bool__
является метод __nonzero__
.👉@BookPython
🔥Podlodka Python Crew — это онлайн-конференции по самым актуальным темам для питонистов.
Разбираем сложные вещи простыми словами, без воды, с уклоном на практику. Сессии проходят в удобное время — утром и вечером.
С 17 по 21 марта пройдет сезон, посвященный оптимизации работы Python-приложений. Разбираем профилирование, внутренности CPython и техники ускорения кода.
🎯Что в программе?
• Оптимизации, которые вы могли упустить — Александр Кучин (Литрес) расскажет, какие скрытые проблемы могут замедлять код и как их исправить 🚀
• Как работает CPython — от запуска скрипта до управления памятью — Василий Рябов разберет, как Python читает и выполняет код, управляет памятью и garbage collection 📌
• Своя Игра: уровни глубины знаний Python-разработчика — Нина Лукина и Евгений Афонасьев в формате викторины объяснят, как Python работает под капотом. Это будет эпично 🎮
• Профилирование на Python — Василий Исаев (Точка) объяснит, как находить узкие места в коде и повышать его производительность с помощью профилирования 💡
Подходы, которые можно внедрить сразу после конференции!
🔗 Подробности и билеты: https://podlodka.io/pythoncrew
Разбираем сложные вещи простыми словами, без воды, с уклоном на практику. Сессии проходят в удобное время — утром и вечером.
С 17 по 21 марта пройдет сезон, посвященный оптимизации работы Python-приложений. Разбираем профилирование, внутренности CPython и техники ускорения кода.
🎯Что в программе?
• Оптимизации, которые вы могли упустить — Александр Кучин (Литрес) расскажет, какие скрытые проблемы могут замедлять код и как их исправить 🚀
• Как работает CPython — от запуска скрипта до управления памятью — Василий Рябов разберет, как Python читает и выполняет код, управляет памятью и garbage collection 📌
• Своя Игра: уровни глубины знаний Python-разработчика — Нина Лукина и Евгений Афонасьев в формате викторины объяснят, как Python работает под капотом. Это будет эпично 🎮
• Профилирование на Python — Василий Исаев (Точка) объяснит, как находить узкие места в коде и повышать его производительность с помощью профилирования 💡
Подходы, которые можно внедрить сразу после конференции!
🔗 Подробности и билеты: https://podlodka.io/pythoncrew
⚡ Как ускорить код на Python? Используем
Привет, друзья! Сегодня расскажу о том, как можно ускорить выполнение кода, заменяя обычные циклы на встроенные функции
✅
Функция
❌ Обычный способ:
✅ Быстрее с
За счёт того, что
✅
Фильтрует элементы последовательности по заданному условию.
❌ Медленный вариант:
✅ Быстрее с
Такой код читается легче и работает быстрее.
✅
Позволяет выполнять кумулятивные операции (например, суммирование, умножение).
❌ Классический способ:
✅ Быстрее с
Этот метод полезен, если нужно свести список к одному значению.
💡 Важно:
Такие функции помогают писать код, который не только быстрее работает, но и легче читается.
👉 @BookPython
map
, filter
, reduce
⚡Привет, друзья! Сегодня расскажу о том, как можно ускорить выполнение кода, заменяя обычные циклы на встроенные функции
map()
, filter()
и reduce()
. Эти инструменты позволяют писать более компактный, читаемый и быстрый код.✅
map()
Функция
map()
применяется к каждому элементу последовательности и возвращает новый итератор.❌ Обычный способ:
numbers = [1, 2, 3, 4, 5]
squared = []
for num in numbers:
squared.append(num ** 2)
✅ Быстрее с
map()
:
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
За счёт того, что
map()
использует C-оптимизированную логику, код выполняется быстрее.✅
filter()
Фильтрует элементы последовательности по заданному условию.
❌ Медленный вариант:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = []
for num in numbers:
if num % 2 == 0:
evens.append(num)
✅ Быстрее с
filter()
:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = list(filter(lambda x: x % 2 == 0, numbers))
Такой код читается легче и работает быстрее.
✅
reduce()
Позволяет выполнять кумулятивные операции (например, суммирование, умножение).
❌ Классический способ:
numbers = [1, 2, 3, 4, 5]
product = 1
for num in numbers:
product *= num
✅ Быстрее с
reduce()
:
from functools import reduce
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
Этот метод полезен, если нужно свести список к одному значению.
💡 Важно:
reduce()
чаще заменяют sum()
или math.prod()
, но для сложных операций он остаётся полезным.Такие функции помогают писать код, который не только быстрее работает, но и легче читается.
👉 @BookPython
Одной из самых непоследовательных частей синтаксиса Python являются литералы кортежей.
По сути, чтобы создать кортеж, вы просто пишете значения, разделенные запятыми:
А как насчет пустого кортежа? Это просто запятая? Нет, это
Пример:
Чтобы все стало еще более запутанным, литералы кортежей часто требуют дополнительных круглых скобок. Если вы хотите, чтобы кортеж был единственным аргументом функции, то
👉 @BookPython
По сути, чтобы создать кортеж, вы просто пишете значения, разделенные запятыми:
1, 2, 3
. Пока что все понятно. А как насчет кортежа, содержащего только один элемент? Вы просто добавляете завершающую запятую к единственному значению: 1,
. Это выглядит несколько некрасиво и может быть подвержено ошибкам, но логика понятна.А как насчет пустого кортежа? Это просто запятая? Нет, это
()
. Значит ли это, что круглые скобки создают кортеж так же, как и запятые? Нет, это не так. (4)
— это не кортеж, это просто 4
.Пример:
a = [
(1, 2, 3),
(1, 2),
(1),
(),
]
[type(x) for x in a]
# Результат: [tuple, tuple, int, tuple]
Чтобы все стало еще более запутанным, литералы кортежей часто требуют дополнительных круглых скобок. Если вы хотите, чтобы кортеж был единственным аргументом функции, то
f(1, 2, 3)
не сработает по очевидной причине — вместо этого нужно написать f((1, 2, 3))
.👉 @BookPython
Если у вас есть ресурсоемкая задача для процессора и вы хотите использовать все доступные ядра, то
Также можно не указывать параметр
👉@BookPython
multiprocessing.Pool
— это то, что вам нужно. Он создает несколько процессов и автоматически распределяет между ними задачи. Просто создайте пул с Pool(number_of_processes)
и выполните p.map
с списком входных данных.
import math
from multiprocessing import Pool
inputs = [i ** 2 for i in range(100, 130)]
def f(x):
return len(str(math.factorial(x)))
# Однопоточное выполнение
%timeit [f(x) for x in inputs]
# 1.44 s ± 19.2 ms per loop (...)
# Параллельное выполнение с 4 процессами
p = Pool(4)
%timeit p.map(f, inputs)
# 451 ms ± 34 ms per loop (...)
Также можно не указывать параметр
number_of_processes
, по умолчанию он равен количеству ядер CPU в системе.👉@BookPython