Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Уроки Python
Введение в искусственный интеллект. Обзор задач
Введение в OpenCV | Работа с камерой
Изучение OpenCV | Распознавание автомобильных номеров
Введение в ImageAI | Распознаем объекты на фото за 7.5 минут без OpenCV
Изучение OpenCV | ImageAI для распознавание объектов в реальном времени
Создаем навык для Яндекс.Алиса с использованием Flask
Интеграция Яндекс.Алиса и Вконтакте
Введение в распознавание контуров через OpenCV
OpenCV. Распознавание цвета. Работа с событиями мыши
Как знакомиться в тиндере с Tinder API
источник
👉@BookPython
Введение в искусственный интеллект. Обзор задач
Введение в OpenCV | Работа с камерой
Изучение OpenCV | Распознавание автомобильных номеров
Введение в ImageAI | Распознаем объекты на фото за 7.5 минут без OpenCV
Изучение OpenCV | ImageAI для распознавание объектов в реальном времени
Создаем навык для Яндекс.Алиса с использованием Flask
Интеграция Яндекс.Алиса и Вконтакте
Введение в распознавание контуров через OpenCV
OpenCV. Распознавание цвета. Работа с событиями мыши
Как знакомиться в тиндере с Tinder API
источник
👉@BookPython
Media is too big
VIEW IN TELEGRAM
Шаблоны проектирования на Python
Паттерны проектирования на Python: Паттерн Строитель
Паттерны проектирования на Python: Паттерн Фабричный метод
Паттерны проектирования на Python: Паттерн Прототип
SOLID принципы на Python: SRP - Принцип единственной ответственности
SOLID принципы на Python: OCP - Принцип открытости / закрытости
SOLID принципы на Python: LSP - Принцип подстановки Лисков
SOLID принципы на Python: ISP - Принцип разделения интерфейса
SOLID принципы на Python: DIP - Принцип инверсии зависимостей
Полный курс на youtube
👉@BookPython
Паттерны проектирования на Python: Паттерн Строитель
Паттерны проектирования на Python: Паттерн Фабричный метод
Паттерны проектирования на Python: Паттерн Прототип
SOLID принципы на Python: SRP - Принцип единственной ответственности
SOLID принципы на Python: OCP - Принцип открытости / закрытости
SOLID принципы на Python: LSP - Принцип подстановки Лисков
SOLID принципы на Python: ISP - Принцип разделения интерфейса
SOLID принципы на Python: DIP - Принцип инверсии зависимостей
Полный курс на youtube
👉@BookPython
❓Вы когда-нибудь хотели стать лучшей версией себя?
Применять SQLAlchemy эффективнее — быстрее, лучше, умнее!
23 декабря, 20:00 мск — открытый урок для Python-разработчиков.
📒Что делать, если методы, использующие SQLAlchemy и СУБД, тормозят? Когда оптимизация внутри SQLAlchemy — благо, а когда — беда? Как создать удобную панель администрирования поверх SQLAlchemy?
Спикер Дмитрий Панкрашов — ведущий разработчик в компании-партнере вендора СЭД «Директум».
🟢Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cGeHTz
Все участники открытого урока получат скидку на курс "Python Developer. Professional"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Применять SQLAlchemy эффективнее — быстрее, лучше, умнее!
23 декабря, 20:00 мск — открытый урок для Python-разработчиков.
📒Что делать, если методы, использующие SQLAlchemy и СУБД, тормозят? Когда оптимизация внутри SQLAlchemy — благо, а когда — беда? Как создать удобную панель администрирования поверх SQLAlchemy?
Спикер Дмитрий Панкрашов — ведущий разработчик в компании-партнере вендора СЭД «Директум».
🟢Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cGeHTz
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Media is too big
VIEW IN TELEGRAM
Как использовать *args и **kwargs в python?
В видео про декораторы мы использовали
👉@BookPython
В видео про декораторы мы использовали
*args
и **kwargs
для того, чтобы передать в функцию любое количество позиционных и именованных аргументов. Для того, чтобы понять как это работает, сначала познакомимся с тем, что такое распаковка.👉@BookPython
Распаковка параметров функций в Python 2 и 3
В Python 2 существовала интересная возможность распаковывать параметры функций прямо в их определении. Пример:
Более того, это работало даже рекурсивно:
Но начиная с Python 3, эта возможность была удалена из языка. Чтобы добиться того же результата, теперь нужно распаковывать параметры вручную:
Удаление этой функциональности сделало код более явным и читаемым, но для любителей компактности Python 2 по-прежнему вызывает лёгкую ностальгию.
👉 @BookPython
В Python 2 существовала интересная возможность распаковывать параметры функций прямо в их определении. Пример:
def between(x, (start, stop)):
return start < x < stop
interval = (5, 10)
print(between(2, interval)) # False
print(between(7, interval)) # True
Более того, это работало даже рекурсивно:
def determinant_2_x_2(((a, b), (c, d))):
return a * d - c * b
matrix = [
(1, 2),
(3, 4),
]
print(determinant_2_x_2(matrix)) # -2
Но начиная с Python 3, эта возможность была удалена из языка. Чтобы добиться того же результата, теперь нужно распаковывать параметры вручную:
def determinant_2_x_2(matrix):
row1, row2 = matrix
a, b = row1
c, d = row2
return a * d - c * b
matrix = [
(1, 2),
(3, 4),
]
print(determinant_2_x_2(matrix)) # -2
Удаление этой функциональности сделало код более явным и читаемым, но для любителей компактности Python 2 по-прежнему вызывает лёгкую ностальгию.
👉 @BookPython
Почему `range()` в Python использует полуоткрытые интервалы?
Функция
Почему полуоткрытые интервалы?
Полуоткрытые интервалы позволяют легко "склеивать" смежные диапазоны без риска ошибок на единицу:
- Если
Это работает идеально, потому что конец одного интервала (`b`) автоматически становится началом следующего.
В случае закрытых интервалов, такая "склейка" требует дополнительной обработки:
Связь с индексацией с нуля
Индексация с нуля в Python также связана с этим принципом. Рассмотрим диапазон
- Этот диапазон включает ровно N элементов, что делает код более предсказуемым:
Здесь
Преимущества для работы с массивами
Полуоткрытые интервалы идеально подходят для работы с индексами массивов:
Интервал
Исторический контекст
Этот подход имеет глубокие корни в компьютерной науке. Эдсгер Дейкстра, один из пионеров программирования, в 1982 году написал блестящую статью, в которой обосновал преимущества полуоткрытых интервалов. Это не просто удобство — это вопрос корректности и простоты работы с данными.
👉 @BookPython
Функция
range()
в Python работает с полуоткрытыми интервалами. Например, range(2, 10)
задаёт числа в диапазоне [2, 10)
, то есть [2, 3, 4, 5, 6, 7, 8, 9]
. На первый взгляд это может показаться неочевидным или асимметричным, но у такого подхода есть свои преимущества.Почему полуоткрытые интервалы?
Полуоткрытые интервалы позволяют легко "склеивать" смежные диапазоны без риска ошибок на единицу:
- Если
a = 2
, b = 5
, и c = 10
, то [a, c)
можно выразить как:
[a, c) = [a, b) + [b, c)
Это работает идеально, потому что конец одного интервала (`b`) автоматически становится началом следующего.
В случае закрытых интервалов, такая "склейка" требует дополнительной обработки:
[a, c] = [a, b] + [b+1, c]
Связь с индексацией с нуля
Индексация с нуля в Python также связана с этим принципом. Рассмотрим диапазон
range(0, N)
:- Этот диапазон включает ровно N элементов, что делает код более предсказуемым:
for i in range(0, N):
print(i)
Здесь
i
проходит значения от 0
до N-1
, что логично и удобно.Преимущества для работы с массивами
Полуоткрытые интервалы идеально подходят для работы с индексами массивов:
arr = [10, 20, 30, 40, 50]
print(arr[1:3]) # [20, 30]
Интервал
[1:3)
охватывает элементы с индексами 1
и 2
, но не 3
, что упрощает вычисления границ.Исторический контекст
Этот подход имеет глубокие корни в компьютерной науке. Эдсгер Дейкстра, один из пионеров программирования, в 1982 году написал блестящую статью, в которой обосновал преимущества полуоткрытых интервалов. Это не просто удобство — это вопрос корректности и простоты работы с данными.
👉 @BookPython
Как узнать размер генератора в Python?
В Python часто возникает задача определить размер генератора без необходимости извлечения всех его значений. Это полезно, если вы работаете с большими потоками данных и хотите избежать избыточного расхода памяти.
Пример с len()
Некоторые итераторы, такие как
Однако генераторы не имеют длины, и попытка вызвать
Стандартное решение: преобразование в список
Один из способов получить размер генератора — это преобразовать его в список:
Этот подход работает, но имеет серьёзный недостаток: он требует загрузить все значения генератора в память. Если генератор очень большой, это может привести к нехватке памяти.
Более эффективный подход: подсчёт с помощью sum
Чтобы избежать лишнего расхода памяти, можно подсчитать количество элементов в генераторе с использованием
Этот метод обходит генератор "лениво", не создавая дополнительных списков, что делает его идеальным для работы с большими потоками данных.
Резюме
- Используйте
- Для генераторов избегайте преобразования в список, если важна экономия памяти.
- Используйте
👉 @BookPython
В Python часто возникает задача определить размер генератора без необходимости извлечения всех его значений. Это полезно, если вы работаете с большими потоками данных и хотите избежать избыточного расхода памяти.
Пример с len()
Некоторые итераторы, такие как
range
, поддерживают вызов len()
:
len(range(10000)) # 10000
Однако генераторы не имеют длины, и попытка вызвать
len()
вызовет ошибку:
gen = (x ** 2 for x in range(10000))
len(gen) # TypeError: object of type 'generator' has no len()
Стандартное решение: преобразование в список
Один из способов получить размер генератора — это преобразовать его в список:
gen = (x ** 2 for x in range(10000))
print(len(list(gen))) # 10000
Этот подход работает, но имеет серьёзный недостаток: он требует загрузить все значения генератора в память. Если генератор очень большой, это может привести к нехватке памяти.
Более эффективный подход: подсчёт с помощью sum
Чтобы избежать лишнего расхода памяти, можно подсчитать количество элементов в генераторе с использованием
sum()
:
gen = (x ** 2 for x in range(10000))
print(sum(1 for _ in gen)) # 10000
Этот метод обходит генератор "лениво", не создавая дополнительных списков, что делает его идеальным для работы с большими потоками данных.
Резюме
- Используйте
len()
только для итераторов, поддерживающих его (например, `range`).- Для генераторов избегайте преобразования в список, если важна экономия памяти.
- Используйте
sum(1 for _ in gen)
для эффективного подсчёта элементов генератора.👉 @BookPython
Когда вам нужно очистить список в Python, вы, скорее всего, используете
Пример:
Хотя это кажется очевидным, правильное решение стало доступно только с введением метода
До этого для очистки списка приходилось использовать:
-
-
Оба варианта работают, поскольку срезы позволяют модифицировать часть списка. Если вы берёте срез
Теперь же
👉 @BookPython
lst = []
. Однако на самом деле вы просто создаёте новый пустой список и присваиваете его переменной lst
, а все другие переменные, которые ссылаются на исходный список, продолжают хранить его содержимое. Пример:
lst = [1, 2, 3]
lst2 = lst
lst = []
print(lst2) # [1, 2, 3]
Хотя это кажется очевидным, правильное решение стало доступно только с введением метода
lst.clear()
в Python 3.3. До этого для очистки списка приходилось использовать:
-
del lst[:]
, или -
lst[:] = []
.Оба варианта работают, поскольку срезы позволяют модифицировать часть списка. Если вы берёте срез
[:]
, он охватывает весь список.Теперь же
lst.clear()
является более читаемым и современным решением. 👉 @BookPython
Подборка Telegram каналов для программистов
Системное администрирование 📌
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/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
Если вы пишете много Python-кода, наверняка сталкивались с типичной задачей: определение класса с простым конструктором и базовыми методами вроде
Это выглядит однообразно, но легко автоматизируется. Популярный пакет attrs позволяет избавиться от такого шаблонного кода:
Пакет attrs генерирует конструктор, метод
Однако с появлением Python 3.7 разработчики получили встроенное решение для этой задачи — data classes. Это стандартный инструмент, который использует аннотации типов для автоматического создания тех же самых методов:
Почему стоит обратить внимание на data classes:
1. Чистый код: Конструкция читается просто и выглядит лаконично.
2. Поддержка стандартной библиотеки: Не нужно добавлять зависимости.
3. Типы и валидация: С аннотациями типов ваш код становится более понятным и безопасным.
attrs остаётся полезным инструментом, особенно если вам нужны более продвинутые возможности (например, валидация значений полей), но для большинства задач data classes — отличное решение прямо "из коробки".
👉@BookPython
__repr__
. Например:
class Server:
def __init__(self, ip, version=4):
self.ip = ip
self._version = version
def __repr__(self):
return '{klass}("{ip}", {version})'.format(
klass=type(self).__name__,
ip=self.ip,
version=self._version,
)
Это выглядит однообразно, но легко автоматизируется. Популярный пакет attrs позволяет избавиться от такого шаблонного кода:
from attrs import define, field
@define
class Server:
ip = field()
_version = field(default=4)
server = Server(ip='192.168.0.0.1', version=4)
Пакет attrs генерирует конструктор, метод
__repr__
, а также методы сравнения (__eq__
, __lt__
, и т.д.) — всё это минимальными усилиями.Однако с появлением Python 3.7 разработчики получили встроенное решение для этой задачи — data classes. Это стандартный инструмент, который использует аннотации типов для автоматического создания тех же самых методов:
from dataclasses import dataclass
@dataclass
class InventoryItem:
name: str
unit_price: float
quantity_on_hand: int = 0
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
Почему стоит обратить внимание на data classes:
1. Чистый код: Конструкция читается просто и выглядит лаконично.
2. Поддержка стандартной библиотеки: Не нужно добавлять зависимости.
3. Типы и валидация: С аннотациями типов ваш код становится более понятным и безопасным.
attrs остаётся полезным инструментом, особенно если вам нужны более продвинутые возможности (например, валидация значений полей), но для большинства задач data classes — отличное решение прямо "из коробки".
👉@BookPython
Пагинация — это стандартная задача, с которой ежедневно сталкиваются тысячи разработчиков. Если вы используете реляционную базу данных, то можно задать смещение через
Этот запрос действительно вернет 100 записей, с 1001-й по 1100-ю. Но проблема в том, что для базы данных это так же сложно, как и выборка всех первых 1001 записей. Чем дальше запрашиваемая страница, тем медленнее будет выполняться запрос.
Более оптимальным решением является использование фильтрации через
Этот подход позволяет избежать сканирования всех предыдущих строк, что значительно ускоряет работу с большими объемами данных.
Если хотите разобраться подробнее, рекомендую почитать отличную статью на эту тему!
👉 @BookPython
LIMIT
, например:
SELECT *
FROM table
LIMIT 1001, 100;
Этот запрос действительно вернет 100 записей, с 1001-й по 1100-ю. Но проблема в том, что для базы данных это так же сложно, как и выборка всех первых 1001 записей. Чем дальше запрашиваемая страница, тем медленнее будет выполняться запрос.
Более оптимальным решением является использование фильтрации через
WHERE
, где клиент передает идентификатор последней записи текущей страницы ($last_seen_id
в примере):
SELECT *
FROM table
WHERE id > $last_seen_id
ORDER BY id ASC
LIMIT 100;
Этот подход позволяет избежать сканирования всех предыдущих строк, что значительно ускоряет работу с большими объемами данных.
Если хотите разобраться подробнее, рекомендую почитать отличную статью на эту тему!
👉 @BookPython
Как ускорить вычисления в Python с помощью
Когда речь заходит о ресурсоемких задачах, которые нагружают ваш CPU, стоит обратить внимание на библиотеку
Вот простой пример:
👉 @BookPython
multiprocessing.Pool
Когда речь заходит о ресурсоемких задачах, которые нагружают ваш CPU, стоит обратить внимание на библиотеку
multiprocessing
, а именно на класс Pool
. Он позволяет задействовать все доступные ядра процессора, автоматически распределяя задачи между ними. Вот простой пример:
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 сек
# Параллельное выполнение
p = Pool(4) # Создаем пул из 4 процессов
%timeit p.map(f, inputs)
# Результат: ~451 мс
👉 @BookPython