Как работает multiprocessing в Python под капотом
Я довольно давно пишу на Python и во многих проектах использовал multiprocessing — пакет стандартной библиотеки языка Python, который предоставляет интерфейс для работы с процессами, очередями, пулами процессов и многими другими удобными инструментами для параллельного программирования. В какой-то момент я понял, что мне не хватает более детального понимания работы этой библиотеки.
Мне захотелось залезть в исходники multiprocessing, разобраться и заодно написать статью. Данная статья в основном рассчитана на новичков в Python и тех, кто хочет подробнее разобраться в том, как именно создаются процессы и пулы в Python и погрузиться в детали реализации.
В статье я не буду рассказывать что такое процессы и зачем они нужны. Почитать самую базу про операционные системы и процессы можно, например, тут и тут. Также важно уточнить, что весь приведенный в статье код соответствует версии Python 3.11.4
https://habr.com/ru/articles/803607/
👉@BookPython
Я довольно давно пишу на Python и во многих проектах использовал multiprocessing — пакет стандартной библиотеки языка Python, который предоставляет интерфейс для работы с процессами, очередями, пулами процессов и многими другими удобными инструментами для параллельного программирования. В какой-то момент я понял, что мне не хватает более детального понимания работы этой библиотеки.
Мне захотелось залезть в исходники multiprocessing, разобраться и заодно написать статью. Данная статья в основном рассчитана на новичков в Python и тех, кто хочет подробнее разобраться в том, как именно создаются процессы и пулы в Python и погрузиться в детали реализации.
В статье я не буду рассказывать что такое процессы и зачем они нужны. Почитать самую базу про операционные системы и процессы можно, например, тут и тут. Также важно уточнить, что весь приведенный в статье код соответствует версии Python 3.11.4
https://habr.com/ru/articles/803607/
👉@BookPython
Python provides the powerful library to work with date and time:
The most popular module for this job is
You can't use
Look at that
Also, after any arithmetic operations, you should
Since Python 3.6, it's recommended to use
If you are interested why
👉@BookPython
datetime.
The interesting part is, datetime
objects have the special interface for timezone support (namely the tzinfo
attribute), but this module only has limited support of its interface, leaving the rest of the job to different modules.The most popular module for this job is
pytz
. The tricky part is, pytz
doesn't fully satisfy tzinfo
interface. The pytz
documentation states this at one of the first lines: “This library differs from the documented Python API for tzinfo implementations.”You can't use
pytz
timezone objects as the tzinfo
attribute. If you try, you may get the absolute insane results:In : paris = pytz.timezone('Europe/Paris')
In : str(datetime(2017, 1, 1, tzinfo=paris))
Out: '2017-01-01 00:00:00+00:09'
Look at that
+00:09
offset. The proper use of pytz
is following:In : str(paris.localize(datetime(2017, 1, 1)))
Out: '2017-01-01 00:00:00+01:00'
Also, after any arithmetic operations, you should
normalize
your datetime object in case of offset changes (on the edge of the DST period for instance).In : new_time = time + timedelta(days=2)
In : str(new_time)
Out: '2018-03-27 00:00:00+01:00'
In : str(paris.normalize(new_time))
Out: '2018-03-27 01:00:00+02:00'
Since Python 3.6, it's recommended to use
dateutil.tz
instead of pytz
. It's fully compatible with tzinfo
, can be passed as an attribute, doesn't require normalize
, though works a bit slower.If you are interested why
pytz
doesn't support datetime
API, or you wish to see more examples, consider reading the decent article on the topic.👉@BookPython
Paul Ganssle
Paul Ganssle - pytz: The Fastest Footgun in the West
An explanation of the differences between dateutil and pytz's time zone models and why people tend to misuse pytz and introduce bugs into their datetime code.
Forwarded from Книги по Python | Books Python 📚
Hands-On Web Scraping with Python: Extract quality data from the web using effective Python techniques, 2nd Edition
Автор: Anish Chapagain (2023)
Применяя практический подход, это обновленное издание использует реальные примеры и упражнения для объяснения ключевых понятий. Начиная с введения в основы web-scraping и программирования на Python, вы рассмотрите ряд методов сбора информации, включая запросы, lxml, pyquery, Scrapy и Beautiful Soup. Вы также познакомитесь с такими продвинутыми темами, как безопасная работа с веб-страницами, веб-интерфейсы, Selenium для веб-скрепинга, извлечение PDF, regex, анализ данных, отчеты EDA, визуализация и машинное обучение.
Скачать
👉 @python_360
Автор: Anish Chapagain (2023)
Применяя практический подход, это обновленное издание использует реальные примеры и упражнения для объяснения ключевых понятий. Начиная с введения в основы web-scraping и программирования на Python, вы рассмотрите ряд методов сбора информации, включая запросы, lxml, pyquery, Scrapy и Beautiful Soup. Вы также познакомитесь с такими продвинутыми темами, как безопасная работа с веб-страницами, веб-интерфейсы, Selenium для веб-скрепинга, извлечение PDF, regex, анализ данных, отчеты EDA, визуализация и машинное обучение.
Скачать
👉 @python_360
Dash
Dash — это популярная библиотека для создания веб-приложений на Python. Она позволяет разработчикам создавать интерактивные, аналитические приложения без необходимости использовать JavaScript.
Dash основан на Flask, Plotly и React, и предоставляет простой способ создания веб-приложений с использованием компонентов, таких как графики, таблицы и формы.
В этом примере мы создаем простое веб-приложение с использованием Dash. Приложение содержит поле ввода, кнопку отправки и контейнер для вывода результата. Мы определяем функцию
👉@BookPython
Dash — это популярная библиотека для создания веб-приложений на Python. Она позволяет разработчикам создавать интерактивные, аналитические приложения без необходимости использовать JavaScript.
Dash основан на Flask, Plotly и React, и предоставляет простой способ создания веб-приложений с использованием компонентов, таких как графики, таблицы и формы.
В этом примере мы создаем простое веб-приложение с использованием Dash. Приложение содержит поле ввода, кнопку отправки и контейнер для вывода результата. Мы определяем функцию
update_output
, которая вызывается при нажатии на кнопку "Submit". Функция возвращает текст, введенный пользователем, и выводит его в контейнере.👉@BookPython
Пример уменьшения размерности данных с помощью линейных и нелинейных методов в Python
Уменьшение размерности данных — это подход упрощения сложных наборов данных для облегчения их обработки. По мере того как данные растут и становятся более сложными, извлекать информацию становится все труднее, а визуализация становится более накладной. Методы уменьшения размерности данных решают эту проблему, предоставляя меньшее количество измерений (столбцов) при сохранении наиболее важной информации. Мы можем потерять некоторые детали, но получить более простое представление данных, которое легче обрабатывать и сравнивать.
https://habr.com/ru/articles/751050/
👉@BookPython
Уменьшение размерности данных — это подход упрощения сложных наборов данных для облегчения их обработки. По мере того как данные растут и становятся более сложными, извлекать информацию становится все труднее, а визуализация становится более накладной. Методы уменьшения размерности данных решают эту проблему, предоставляя меньшее количество измерений (столбцов) при сохранении наиболее важной информации. Мы можем потерять некоторые детали, но получить более простое представление данных, которое легче обрабатывать и сравнивать.
https://habr.com/ru/articles/751050/
👉@BookPython
Отправка электронных писем
Приведенный скрипт использует библиотекуSMTP, чтобы отправлять электронные письма указанным получателям. Реализация может быть изменена в зависимости от варианта использования.
В приведенной выше реализации скрипт использует данные отправителя и получателя, а также тему и текст сообщения. Затем скрипт подключается к SMTP-серверу Gmail, форматирует сообщение и отправляет его с помощью метода
👉@BookPython
Приведенный скрипт использует библиотекуSMTP, чтобы отправлять электронные письма указанным получателям. Реализация может быть изменена в зависимости от варианта использования.
В приведенной выше реализации скрипт использует данные отправителя и получателя, а также тему и текст сообщения. Затем скрипт подключается к SMTP-серверу Gmail, форматирует сообщение и отправляет его с помощью метода
sendmail()
. Наконец, скрипт выводит сообщение, указывающее, что электронное письмо было успешно отправлено, и отключается от SMTP-сервера.👉@BookPython
ScrapeGraphAI
Python-скрепер на основе искусственного интеллекта
ScrapeGraphAI - это python-библиотека для веб-скреппинга, которая использует LLM и прямую графовую логику для создания конвейеров скреппинга для веб-сайтов и локальных документов (XML, HTML, JSON и т.д.).
Просто скажите, какую информацию вы хотите извлечь, и библиотека сделает это за вас!
https://github.com/VinciGit00/Scrapegraph-ai
👉@BookPython
Python-скрепер на основе искусственного интеллекта
ScrapeGraphAI - это python-библиотека для веб-скреппинга, которая использует LLM и прямую графовую логику для создания конвейеров скреппинга для веб-сайтов и локальных документов (XML, HTML, JSON и т.д.).
Просто скажите, какую информацию вы хотите извлечь, и библиотека сделает это за вас!
https://github.com/VinciGit00/Scrapegraph-ai
👉@BookPython
Подборка Telegram каналов для программистов
Системное администрирование 📌
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
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
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/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
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 Полезные советы по программированию
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 Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
Системное администрирование 📌
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
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT.
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
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/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
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 Полезные советы по программированию
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 Канал по математике
Excel лайфхак📌
https://t.me/Excel_lifehack
Nested Sets (вложенные множества)
Это способ организации иерархических данных, где каждый узел дерева представлен парой чисел, определяющих диапазон значений.
Каждая категория представлена объектом, содержащим поля "
Преимущество использования
В этом примере мы находим всех потомков категории "Компьютеры".
*При изменении структуры дерева требуется обновление левых и правых границ всех связанных категорий.
👉@BookPython
Это способ организации иерархических данных, где каждый узел дерева представлен парой чисел, определяющих диапазон значений.
Каждая категория представлена объектом, содержащим поля "
ID
", "Название", "Левая граница" и "Правая граница". "Левая граница" и "Правая граница" определяют диапазон значений, которые охватывают поддерево данной категории.Преимущество использования
Nested Sets
заключается в том, что мы можем эффективно извлекать всех потомков узла, находить родителей и определять уровень вложенности с помощью простых операций сравнения. В этом примере мы находим всех потомков категории "Компьютеры".
*При изменении структуры дерева требуется обновление левых и правых границ всех связанных категорий.
👉@BookPython
Революционный подход к нейросетям: рассказываем про KAN (Kolmogorov-Arnold Networks)
Эволюция архитектуры нейронных сетей уходит корнями в фундаментальные работы, заложенные в 1940-х годах Уорреном Маккаллохом и Уолтером Питcом, которые предложили концепцию искусственных нейронов и их взаимосвязь.
Однако значительные прорывы произошли только в 1980-х годах с разработкой алгоритмов обратного распространения ошибки: алгоритм Геоффри Хинтона и других – все это позволило создавать более глубокие нейронные сети и улучшить методы обучения.
В это время появились классические архитектуры, многослойные перцептроны (MLP, и сверточные нейронные сети (CNN), которые революционизировали различные области, включая компьютерное зрение, обработку естественного языка и распознавание образов – теперь мы говорим про своего рода инновационную архитектуру.
https://habr.com/ru/articles/820891/
👉@BookPython
Эволюция архитектуры нейронных сетей уходит корнями в фундаментальные работы, заложенные в 1940-х годах Уорреном Маккаллохом и Уолтером Питcом, которые предложили концепцию искусственных нейронов и их взаимосвязь.
Однако значительные прорывы произошли только в 1980-х годах с разработкой алгоритмов обратного распространения ошибки: алгоритм Геоффри Хинтона и других – все это позволило создавать более глубокие нейронные сети и улучшить методы обучения.
В это время появились классические архитектуры, многослойные перцептроны (MLP, и сверточные нейронные сети (CNN), которые революционизировали различные области, включая компьютерное зрение, обработку естественного языка и распознавание образов – теперь мы говорим про своего рода инновационную архитектуру.
https://habr.com/ru/articles/820891/
👉@BookPython
Напишите функцию, которая будет принимать список nums, содержащий числа в диапазоне от 1 до 100, и возвращать отсортированный список чисел, которые в списке nums встречались дважды.
Примеры:
Примечания:
— никакое число не будет встречаться в nums трижды и более раз,
— если никакое число в nums не встречалось дважды, функция должна вернуть
👉@BookPython
Примеры:
duplicate_nums([1, 2, 3, 4, 3, 5, 6])
➞ [3]
duplicate_nums([81, 72, 43, 72, 81, 99, 99, 100, 12, 54])
➞ [72, 81, 99]
duplicate_nums([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
➞ None
Примечания:
— никакое число не будет встречаться в nums трижды и более раз,
— если никакое число в nums не встречалось дважды, функция должна вернуть
None
.👉@BookPython
Что происходит, когда запускаешь «Hello World» в Linux
Сегодня я задумалась о том, что происходит, когда запускаешь в Linux простую программу «Hello World» на Python.
Вот как это выглядит в командной строке:
Но внутри происходит гораздо больше. Я объясню, что там творится, и, что гораздо важнее, расскажу об инструментах, при помощи которых вы сами сможете исследовать происходящее. Мы воспользуемся readelf, strace, ldd, debugfs, /proc, ltrace, dd и stat. Я не буду рассматривать относящиеся к Python части, только объясню, что происходит при выполнении динамически компонуемых исполняемых файлов.
https://habr.com/ru/companies/ruvds/articles/753506/
👉@BookPython
Сегодня я задумалась о том, что происходит, когда запускаешь в Linux простую программу «Hello World» на Python.
print("hello world")
Вот как это выглядит в командной строке:
$ python3 hello.py
hello world
Но внутри происходит гораздо больше. Я объясню, что там творится, и, что гораздо важнее, расскажу об инструментах, при помощи которых вы сами сможете исследовать происходящее. Мы воспользуемся readelf, strace, ldd, debugfs, /proc, ltrace, dd и stat. Я не буду рассматривать относящиеся к Python части, только объясню, что происходит при выполнении динамически компонуемых исполняемых файлов.
https://habr.com/ru/companies/ruvds/articles/753506/
👉@BookPython
Библиотека Feather
Feather — это библиотека для эффективного чтения и записи таблиц данных в двоичный формат. Она использует формат Apache Arrow для сериализации данных, что позволяет быстро читать и записывать данные без потери информации.
В этом примере мы использовали две основные функции библиотеки:
—
—
Feather позволяет быстро и эффективно обмениваться данными между Python и R, а также обеспечивает быстрое чтение и запись таблиц данных на диск.
👉@BookPython
Feather — это библиотека для эффективного чтения и записи таблиц данных в двоичный формат. Она использует формат Apache Arrow для сериализации данных, что позволяет быстро читать и записывать данные без потери информации.
В этом примере мы использовали две основные функции библиотеки:
—
feather.write_dataframe()
: записывает таблицу данных в файл формата Feather.—
feather.read_dataframe()
: читает таблицу данных из файла формата Feather.Feather позволяет быстро и эффективно обмениваться данными между Python и R, а также обеспечивает быстрое чтение и запись таблиц данных на диск.
👉@BookPython
Python, внешние функции и Steam
Языковые экосистемы не идеальны. Иногда получаемые исполняемые файлы работоспособны, но синтаксис ужасен, иногда есть хороший менеджер пакетов, но стандартные функции скудны до невозможности - все дело в компромиссе.
https://arturdryomov.dev/posts/python-foreign-functions-and-steam/
👉@BookPython
Языковые экосистемы не идеальны. Иногда получаемые исполняемые файлы работоспособны, но синтаксис ужасен, иногда есть хороший менеджер пакетов, но стандартные функции скудны до невозможности - все дело в компромиссе.
https://arturdryomov.dev/posts/python-foreign-functions-and-steam/
👉@BookPython
arturdryomov.dev
Python, foreign functions and Steam
Calling Steamworks from Python without overhead
When you use a variable in Python, it's first looked up in the current scope. If no such variable is found, the next enclosing scope is searched. That is repeated until the global namespace is reached.
However, the variable assignment doesn't work the same way. The new variable is always created in the current scope unless
x = 1
def scope():
x = 2
def inner_scope():
print(x) # prints 2
inner_scope()
scope()
However, the variable assignment doesn't work the same way. The new variable is always created in the current scope unless
global
or nonlocal
is specified:x = 1
def scope():
x = 2
def inner_scope():
x = 3
print(x) # prints 3
inner_scope()
print(x) # prints 2
scope()
print(x) # prints 1
global
allows using variables of global namespaces while nonlocal
searches for the variable in the nearest enclosing scope. Compare:x = 1
def scope():
x = 2
def inner_scope():
global x
x = 3
print(x) # prints 3
inner_scope()
print(x) # prints 2
scope()
print(x) # prints 3
x = 1
def scope():
x = 2
def inner_scope():
nonlocal x
x = 3
print(x) # prints 3
inner_scope()
print(x) # prints 3
scope()
print(x) # prints 1
👉@BookPythonУскорение роутера в Django в 51 раз
История началась с разбора использования ресурсов приложением, которое занимается проксированием. Обнаружили, что довольно много времени оно тратит на выбор маршрута (роута), и решили ускорить этот процесс. Описанная в статье оптимизация не требует каких-то особых вложений, усилий или условий, поэтому приведенный код можно забрать к себе и использовать без каких-либо чрезмерных вмешательств.
https://habr.com/ru/companies/tochka/articles/822431/
👉@BookPython
История началась с разбора использования ресурсов приложением, которое занимается проксированием. Обнаружили, что довольно много времени оно тратит на выбор маршрута (роута), и решили ускорить этот процесс. Описанная в статье оптимизация не требует каких-то особых вложений, усилий или условий, поэтому приведенный код можно забрать к себе и использовать без каких-либо чрезмерных вмешательств.
https://habr.com/ru/companies/tochka/articles/822431/
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM