Где держать Telegram-бота или API, чтобы они не падали под нагрузкой и не съедали бюджет?
Tproger собрал подборку из шести VPS-провайдеров под этот сценарий: от тарифов за пару сотен рублей в месяц до конфигураций с DDR5 и портом 10 Гбит/с. У каждого свой акцент — где-то посуточная оплата и запуск за минуту, где-то API для CI/CD, бэкапы и приватные сети, где-то зарубежные локации.
Внутри по каждому провайдеру: реальные конфигурации, цены, на какой нагрузке тестировали и под какой сценарий брать.
https://tproger.ru/articles/gde-razvernut-bota-ili-api---podborka-vps--kotorye-ne-tormozyat
Tproger собрал подборку из шести VPS-провайдеров под этот сценарий: от тарифов за пару сотен рублей в месяц до конфигураций с DDR5 и портом 10 Гбит/с. У каждого свой акцент — где-то посуточная оплата и запуск за минуту, где-то API для CI/CD, бэкапы и приватные сети, где-то зарубежные локации.
Внутри по каждому провайдеру: реальные конфигурации, цены, на какой нагрузке тестировали и под какой сценарий брать.
https://tproger.ru/articles/gde-razvernut-bota-ili-api---podborka-vps--kotorye-ne-tormozyat
Tproger
Где развернуть бота или API — подборка VPS, которые не тормозят
Мы собрали подборку провайдеров VPS, где можно быстро поднять сервис — от тестового окружения до продакшн-нагрузки.
👍1👏1
Вышла CPython 3.15.0b3 — предпоследняя бета перед заморозкой
23 июня вышла третья из четырёх бета-версий Python 3.15: около 195 правок от 86 контрибьюторов со времён второй беты. Набор фич уже заморожен, дальше только багфиксы и шлифовка. Release candidate назначен на 4 августа, финальный релиз на 1 октября, и команда просит прогнать свой код на бете, чтобы поймать регрессии и поломки ABI заранее.
Что приедет в серии 3.15 по сравнению с 3.14:
🔘 PEP 686: UTF-8 становится кодировкой по умолчанию, открытие файлов без явного
🔘 PEP 810: явные ленивые импорты, модуль грузится при первом обращении, а не на старте программы, это срезает время запуска тяжёлых утилит;
🔘 PEP 814: встроенный тип
🔘 PEP 661: встроенный
🔘 PEP 798: распаковка через
🔘 PEP 799: отдельный пакет для профилирования и Tachyon, высокочастотный статистический сэмплер.
@zen_of_python
23 июня вышла третья из четырёх бета-версий Python 3.15: около 195 правок от 86 контрибьюторов со времён второй беты. Набор фич уже заморожен, дальше только багфиксы и шлифовка. Release candidate назначен на 4 августа, финальный релиз на 1 октября, и команда просит прогнать свой код на бете, чтобы поймать регрессии и поломки ABI заранее.
Что приедет в серии 3.15 по сравнению с 3.14:
encoding больше не зависит от локали системы;frozendict, неизменяемый словарь без сторонних библиотек;sentinel для значений-маркеров вместо самодельных объектов-заглушек;* и ** прямо внутри list- и dict-comprehension;@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤9👏2🤩1
uv 0.11.26 — резолвер зависимостей ускорили сразу с четырёх сторон
uv — быстрый пакетный менеджер и резолвер зависимостей для Python на Rust, замена pip и pip-tools в одном бинарнике. Версия 0.11.26 вышла 30 июня и целиком посвящена скорости резолвинга.
Что ускорили:
🔘 зависимости в PubGrub теперь передаются как ID вместо полных структур, это снижает накладные расходы на каждой итерации резолвера;
🔘 убрали лишние аллокации в ForkMap::contains, структуре, которая проверяет пересечения версий между форками резолвера;
🔘 резолвер стал переиспользовать уже проделанную работу между итерациями PubGrub вместо пересчёта с нуля;
🔘 ускорили выбор кандидата версии для непересекающихся диапазонов зависимостей.
Заодно поправили мелочь: uv теперь предупреждает, если build cache случайно оказался внутри директории с исходниками проекта.
Резолвер зависимостей редко попадает в заголовки, но именно на нём держится ощущение «uv install мгновенный». Вы уже увидели разницу в скорости на своих проектах, или для небольших requirements.txt она и так была незаметна?
@zen_of_python
uv — быстрый пакетный менеджер и резолвер зависимостей для Python на Rust, замена pip и pip-tools в одном бинарнике. Версия 0.11.26 вышла 30 июня и целиком посвящена скорости резолвинга.
Что ускорили:
Заодно поправили мелочь: uv теперь предупреждает, если build cache случайно оказался внутри директории с исходниками проекта.
Резолвер зависимостей редко попадает в заголовки, но именно на нём держится ощущение «uv install мгновенный». Вы уже увидели разницу в скорости на своих проектах, или для небольших requirements.txt она и так была незаметна?
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤🔥5👻3❤1👍1
Forwarded from Веб-страница
django-scroll-to-top: кнопка «наверх», которая не ломается в проде
Кнопка «наверх» кажется мелочью, пока в проде не всплывают cookie-баннер, чат поддержки, нижняя мобильная навигация и строгий CSP. Автор собрал типовые условия в Django-пакет
Без jQuery, CDN и обязательной сборки. Если JavaScript выключён, остаётся обычная ссылка в начало страницы. Если в ваших Django-проектах кнопку надоело таскать между шаблонами, я бы заглянул в разбор на Tproger.
Кнопка «наверх» кажется мелочью, пока в проде не всплывают cookie-баннер, чат поддержки, нижняя мобильная навигация и строгий CSP. Автор собрал типовые условия в Django-пакет
django-scroll-to-top: один template-тег, Django Admin, настройка цвета и положения через админку без правки шаблонов.Без jQuery, CDN и обязательной сборки. Если JavaScript выключён, остаётся обычная ссылка в начало страницы. Если в ваших Django-проектах кнопку надоело таскать между шаблонами, я бы заглянул в разбор на Tproger.
У Python появится отдельный совет по паковке — назначили даты первых выборов
После того как Steering Council в апреле утвердил PEP 772, PSF объявила даты первых выборов в новый Python Packaging Council: технический орган, который берёт на себя решения по спецификациям совместимости пакетов.
Совет состоит из пяти мест: два кандидата с наибольшим числом голосов получают двухлетний срок, а три оставшихся получают годовой. Голосование пройдёт параллельно с выборами PSF Board 2026.
Даты, если планируете участвовать:
🔘 28 июля: открытие номинаций;
🔘 11 августа: закрытие номинаций;
🔘 13 августа: публикация списка кандидатов;
🔘 25 августа: дедлайн подтверждения намерения голосовать;
🔘 1–15 сентября: само голосование.
Голосовать смогут члены PSF уровня Contributing, Supporting или Fellow, которые заранее подтвердят намерение участвовать.
Управление пакетным хозяйством Python годами было разбросано между pip, PyPA, отдельными PEP и добровольцами-энтузиастами. Кажется ли вам, что выделенный совет реально наведёт порядок, или это ещё один орган для лишних согласований?
@zen_of_python
После того как Steering Council в апреле утвердил PEP 772, PSF объявила даты первых выборов в новый Python Packaging Council: технический орган, который берёт на себя решения по спецификациям совместимости пакетов.
Совет состоит из пяти мест: два кандидата с наибольшим числом голосов получают двухлетний срок, а три оставшихся получают годовой. Голосование пройдёт параллельно с выборами PSF Board 2026.
Даты, если планируете участвовать:
Голосовать смогут члены PSF уровня Contributing, Supporting или Fellow, которые заранее подтвердят намерение участвовать.
Управление пакетным хозяйством Python годами было разбросано между pip, PyPA, отдельными PEP и добровольцами-энтузиастами. Кажется ли вам, что выделенный совет реально наведёт порядок, или это ещё один орган для лишних согласований?
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤5🙈1
Вышла третья бета Python 3.15 — предпоследняя перед релиз-кандидатом, который намечен на 4 августа. Набор фич зафиксирован, так что уже понятно, что войдёт в релиз:
🔘 ленивые импорты для ускорения старта (PEP 810);
🔘 встроенные типы
🔘 сэмплирующий профайлер Tachyon и отдельный пакет для организации инструментов профилирования (PEP 799);
🔘 распаковка в comprehensions (PEP 798) и UTF-8 как кодировка по умолчанию (PEP 686);
🔘 заметно ускоренный JIT: 8–9% среднего прироста на x86-64 Linux относительно обычного интерпретатора, 12–13% на macOS/AArch64;
🔘 стабильный ABI для free-threaded сборок.
В самой бете 195 исправлений от 86 контрибьюторов, последняя бета выйдет 18 июля. Разработчикам библиотек самое время прогнать тесты на 3.15 и собрать пререлизные wheels.
Уже пробовали 3.15 на своих проектах или ждёте стабильного релиза?
@zen_of_python
frozendict (PEP 814) и sentinel (PEP 661);В самой бете 195 исправлений от 86 контрибьюторов, последняя бета выйдет 18 июля. Разработчикам библиотек самое время прогнать тесты на 3.15 и собрать пререлизные wheels.
Уже пробовали 3.15 на своих проектах или ждёте стабильного релиза?
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥2🥰1
В Python появится встроенный
Что внутри:
🔘 неизменяемый словарь: попытка присвоить элемент даёт
🔘 хешируемый, если хешируемы все значения, так что его можно класть в
🔘 сохраняет порядок вставки, но сравнение и хеш от порядка не зависят;
🔘 поддерживает объединение через
Главное отличие от
Ждёте
@zen_of_python
frozendict: Steering Council принял PEP 814, и тип уже доступен в бета-версиях Python 3.15. Виктор Стиннер, соавтор PEP, рассказал историю вопроса: его первую попытку, PEP 416, Гвидо отклонил ещё в 2012 году.Что внутри:
TypeError;set и использовать как ключ словаря;| и сравнение с обычным dict.Главное отличие от
types.MappingProxyType в том, что прокси остаётся обёрткой над живым словарём, а frozendict — самостоятельный неизменяемый тип со своим хешем.Ждёте
frozendict в 3.15 или вам хватало MappingProxyType?@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
Cursor против Windsurf: что выбрать питонисту
Real Python сравнил два редактора на примере отказоустойчивого HTTP-клиента. Оба работают поверх VS Code, но подходят к ИИ по-разному: Cursor выводит агента, который правит код по запросу, а Windsurf предлагает Cascade с авто-выполнением команд в терминале.
Для питониста разница в деталях: Cursor Tab и Windsurf Tab по-разному дополняют код; в отладке Cursor использует inline-обзор и Bugbot, а Windsurf полагается на авто-линтинг. Раньше приходилось прыгать между редактором и отдельным ИИ-чатом, теперь оба инструмента пытаются убрать это трение.
Если пишете много асинхронного Python, имеет смысл протестировать оба и сравнить на своих задачах.
Real Python сравнил два редактора на примере отказоустойчивого HTTP-клиента. Оба работают поверх VS Code, но подходят к ИИ по-разному: Cursor выводит агента, который правит код по запросу, а Windsurf предлагает Cascade с авто-выполнением команд в терминале.
Для питониста разница в деталях: Cursor Tab и Windsurf Tab по-разному дополняют код; в отладке Cursor использует inline-обзор и Bugbot, а Windsurf полагается на авто-линтинг. Раньше приходилось прыгать между редактором и отдельным ИИ-чатом, теперь оба инструмента пытаются убрать это трение.
Если пишете много асинхронного Python, имеет смысл протестировать оба и сравнить на своих задачах.
🔥2
Ваша память ещё работает или нейронки уже и помнят всё за вас?
Чтобы это проверить мы приготовили для вас «Меморину» — игру, которая поможет проверить вашу память.
Всё просто: нужно запомнить и выбрать одинаковые карточки. Если память плохая, то рано или поздно вы всё равно справитесь. А если хорошая, то сможете увидеть ваш потолок скорости.
Ну что, готовы проверить? Тогда переходите по ссылке: https://tprg.ru/ydAe
Чтобы это проверить мы приготовили для вас «Меморину» — игру, которая поможет проверить вашу память.
Всё просто: нужно запомнить и выбрать одинаковые карточки. Если память плохая, то рано или поздно вы всё равно справитесь. А если хорошая, то сможете увидеть ваш потолок скорости.
Ну что, готовы проверить? Тогда переходите по ссылке: https://tprg.ru/ydAe
👎1🤣1💊1
Django выпустил плановые security-релизы 6.0.7 и 5.2.16 — закрыты три уязвимости, и у каждой любопытный механизм:
🔘 кэш-мидлварь UpdateCacheMiddleware и декоратор cache_page не кэшировали ответ с Set-Cookie, только если входящий запрос был совсем без cookie. Если у пользователя уже была любая безобидная cookie вроде выбора темы, защита не срабатывала — и ответ с чужой сессионной cookie мог осесть в общем кэше;
🔘 при создании GDALRaster из bytes свойство vsi_buffer могло прочитать примерно 32 байта за границей буфера — с риском утечки соседней памяти кучи, а в редких случаях и падения процесса;
🔘 DomainNameValidator пропускал переносы строк в доменных именах — если такое значение попадало в HTTP-ответ, открывалась инъекция заголовков.
Первые две помечены низкой серьёзностью, но команда рекомендует обновиться как можно скорее всем.
Обновляете Django сразу после security-релизов или ждёте планового окна?
@zen_of_python
Первые две помечены низкой серьёзностью, но команда рекомендует обновиться как можно скорее всем.
Обновляете Django сразу после security-релизов или ждёте планового окна?
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Точка входа в программирование
Как собрать разрозненный Python в одну картинку
Real Python предлагает проверить понимание концепций языка тремя шагами: объяснить концепцию своими словами, найти ей знакомый аналог и применить в маленькой задаче.
Суть — не зубрить, а увидеть, как идея работает в коде. Возьмите тему, которую пока не чувствуете, и опишите её так, будто соседу по парте. Да, тот самый метод утёнка. Потом дайте себе пять минут и сравните её с похожей. Разница, которую вы сформулируете словами, лучше конспекта покажет, где остались дыры.
Real Python предлагает проверить понимание концепций языка тремя шагами: объяснить концепцию своими словами, найти ей знакомый аналог и применить в маленькой задаче.
Суть — не зубрить, а увидеть, как идея работает в коде. Возьмите тему, которую пока не чувствуете, и опишите её так, будто соседу по парте. Да, тот самый метод утёнка. Потом дайте себе пять минут и сравните её с похожей. Разница, которую вы сформулируете словами, лучше конспекта покажет, где остались дыры.
✍3
Пример прикладной робототехники: на хакатоне «Робозон» участники собирают интеллектуальную систему сортировки товаров.
Задачи охватывают весь цикл — детекция и классификация объектов, трекинг на конвейере, планирование захвата и управление манипулятором. За интеграцию отвечает связка компьютерного зрения с ROS.
В ход идут Python, OpenCV, PyTorch/Detectron2, ROS/ROS2 и симуляторы вроде Isaac Gym и CoppeliaSim. Отдельный слой — имитационное моделирование движения товаров и проектирование конструкции самого сортировщика.
Финальные решения команды покажут на конференции E-CODE. Описание задач лежит в открытом доступе, если интересно посмотреть постановку.
Задачи охватывают весь цикл — детекция и классификация объектов, трекинг на конвейере, планирование захвата и управление манипулятором. За интеграцию отвечает связка компьютерного зрения с ROS.
В ход идут Python, OpenCV, PyTorch/Detectron2, ROS/ROS2 и симуляторы вроде Isaac Gym и CoppeliaSim. Отдельный слой — имитационное моделирование движения товаров и проектирование конструкции самого сортировщика.
Финальные решения команды покажут на конференции E-CODE. Описание задач лежит в открытом доступе, если интересно посмотреть постановку.
❤2👍2
Метакласс: не магия, а ещё один уровень явности Python
Если класс — фабрика объектов, то метакласс играет роль фабрики самих классов. В Python 3 это не опция, а дефолт: любой ваш класс является экземпляром
Свой метакласс наследуется от
Отсюда следует, почему в Python всё есть объект, включая само определение класса. Разбираемся в деталях.
Если класс — фабрика объектов, то метакласс играет роль фабрики самих классов. В Python 3 это не опция, а дефолт: любой ваш класс является экземпляром
type, а class Foo: pass раскрывается в type('Foo', (), {}).Свой метакласс наследуется от
type и переопределяет __new__ или __init__. Он позволяет собирать, изменять или регистрировать классы программно, но в Python явность важнее изящества. В большинстве случаев ту же задачу решают наследование или декоратор класса.Отсюда следует, почему в Python всё есть объект, включая само определение класса. Разбираемся в деталях.
❤3🤨1
Вышел mypy 2.2 — главное в релизе то, что тайпчекер научился закрытым TypedDict из PEP 728.
Что внутри:
🔘 TypedDict с closed=True запрещает любые ключи сверх объявленных — раньше лишние ключи в значении типа TypedDict были формально допустимы, и тайпчекер не мог на них ругаться;
🔘 закрытость делает надёжным сужение типов: в объединении Book | DVD проверка "author" in item теперь честно доказывает mypy, что перед ним Book;
🔘 работает и в классовом синтаксисе: class Book(TypedDict, closed=True);
🔘 завершена поддержка дефолтов типовых переменных из PEP 696 — и в старой записи TypeVar("T", default=int), и в новой class Box[T = int], включая рекурсивные дефолты;
🔘 mypy теперь уважает явно аннотированный тип возврата у
🔘 поддержка TypeForm перестала быть экспериментальной.
Пользуетесь TypedDict для словарей с фиксированной структурой или в таких местах у вас dataclass и pydantic?
@zen_of_python
Что внутри:
__new__ — раньше он молча считал, что __new__ всегда возвращает экземпляр текущего класса;Пользуетесь TypedDict для словарей с фиксированной структурой или в таких местах у вас dataclass и pydantic?
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Go-рутины в Python без async/await
Runloom экспериментально возвращает Python к простоте блокирующего кода: вызываете
Под капотом: hand-rolled ассемблерный context switch, work-stealing scheduler на C и netpoll. Цель: free-threaded Python 3.14t с выключенным GIL, когда один процесс действительно может загрузить все ядра, а не притворяться многопоточным.
Репозиторий на GitHub.
Runloom экспериментально возвращает Python к простоте блокирующего кода: вызываете
fiber(fn), пишете обычный recv/send или urlopen, а библиотека паркует задачу на сокете и переключает контекст. Никакого async def, никакого await — как до эпохи asyncio, но с миллионом лёгких потоков на всех ядрах.Под капотом: hand-rolled ассемблерный context switch, work-stealing scheduler на C и netpoll. Цель: free-threaded Python 3.14t с выключенным GIL, когда один процесс действительно может загрузить все ядра, а не притворяться многопоточным.
Репозиторий на GitHub.
✍1
Forwarded from GameDev: разработка игр
80% корпоративных программ геймификации ломаются на одном и том же месте
По данным AmplifAI, игровые кампании дают в среднем вовлечённость на 100–150% выше, чем классические подходы, а геймифицированный контент шерится в 12 раз чаще. При этом примерно 80% корпоративных программ геймификации не достигают целей. Спрос огромный, качество — низкое, а причина проста: делать это берутся не те люди.
В статье разбирают, как корпоративные клоны механик упускают баланс и контекст, и что делать, чтобы прогрессия не превращалась в цифровой пендель. Для геймдевелоперов это отличная ниша, где есть и деньги, и возможность применить свои скиллы на практике.
По данным AmplifAI, игровые кампании дают в среднем вовлечённость на 100–150% выше, чем классические подходы, а геймифицированный контент шерится в 12 раз чаще. При этом примерно 80% корпоративных программ геймификации не достигают целей. Спрос огромный, качество — низкое, а причина проста: делать это берутся не те люди.
В статье разбирают, как корпоративные клоны механик упускают баланс и контекст, и что делать, чтобы прогрессия не превращалась в цифровой пендель. Для геймдевелоперов это отличная ниша, где есть и деньги, и возможность применить свои скиллы на практике.
GameDev: разработка игр
80% корпоративных программ геймификации ломаются на одном и том же месте По данным AmplifAI, игровые кампании дают в среднем вовлечённость на 100–150% выше, чем классические подходы, а геймифицированный контент шерится в 12 раз чаще. При этом примерно 80%…
Представьте: прошли игру на сайте и выиграли приз от бренда. Какой обрадует по-настоящему? 👇
Anonymous Poll
59%
Гаджеты: наушники, клавиатура, повербанк
56%
Мерч, который не стыдно носить вне дома
27%
Подписки на полезные или дорогие сервисы
26%
Курсы и книги
31%
Билет на конференцию или митап
56%
Что-то редкое, чего не купить за деньги
6%
Приз не важен — играю ради азарта
Репозиторий python-patterns: каталог паттернов, которые стоит выбирать с умом
В python-patterns собраны классические паттерны и идиомы Python — 42,8k звёзд, 7k форков и 896 коммитов. Сообщество использует его как шпаргалку, чтобы быстро вспомнить, как выглядит тот или иной подход в коде.
Авторы явно предупреждают: каждый паттерн несёт свои компромиссы, а выбирать нужно не по красоте реализации, а по ситуации. В Python это особенно актуально — язык сам даёт идиомы, от итераторов до менеджеров контекста, и часто проще использовать встроенное, чем городить фабрику.
Полезно сохранить на тот момент, когда вам хочется применить паттерн ради паттерна. Иногда достаточно обычной функции.
В python-patterns собраны классические паттерны и идиомы Python — 42,8k звёзд, 7k форков и 896 коммитов. Сообщество использует его как шпаргалку, чтобы быстро вспомнить, как выглядит тот или иной подход в коде.
Авторы явно предупреждают: каждый паттерн несёт свои компромиссы, а выбирать нужно не по красоте реализации, а по ситуации. В Python это особенно актуально — язык сам даёт идиомы, от итераторов до менеджеров контекста, и часто проще использовать встроенное, чем городить фабрику.
Полезно сохранить на тот момент, когда вам хочется применить паттерн ради паттерна. Иногда достаточно обычной функции.
❤2✍2
На Tproger вышла история разработчика с 10 годами опыта: с инженерной частью у него всё было закрыто, а для своего дела не хватало другого — проверять идею, считать деньги, доводить продукт до рынка. Онлайн-курсы он бросал на середине, поэтому выбрал формат пожёстче: онлайн-магистратуру МФТИ по технологическому предпринимательству.
В обзоре: как совмещать такую учёбу с работой, почему реальная нагрузка выходит 20–25 часов в неделю вместо заявленных 10, где программа слабая и во сколько она обойдётся в 2026 году.
@zen_of_python
В обзоре: как совмещать такую учёбу с работой, почему реальная нагрузка выходит 20–25 часов в неделю вместо заявленных 10, где программа слабая и во сколько она обойдётся в 2026 году.
@zen_of_python
Tproger
Сколько стоит стать предпринимателем: обзор онлайн-магистратуры МФТИ
Разработчик прошёл онлайн-магистратуру МФТИ по технологическому предпринимательству и рассказывает: формат, нагрузка, стоимость и стоит ли идти.
❤1
Altair: графики через описание данных, а не ручная настройка каждой оси
В духе Zen of Python: простое лучше сложного. Если в Matplotlib вы сначала объявляете фигуру, потом крутите оси и legend, то в Altair вы просто говорите DataFrame, какую колонку на какую ось положить, что раскрасить и как сделать интерактивным. Библиотека сама строит визуализацию из HTML и JavaScript, которая работает в ноутбуке или сохраняется отдельным файлом.
Real Python советует ставить Altair в выделенное виртуальное окружение: вместе с ним приезжают pandas и Vega-Lite-рендерер, и лучше не мешать их с остальным окружением.
Это не замена Matplotlib. Для пиксельно точных публикационных фигур или 3D по-прежнему стоит брать Matplotlib; для интерактивного исследования в ноутбуке — Altair удобнее.
В духе Zen of Python: простое лучше сложного. Если в Matplotlib вы сначала объявляете фигуру, потом крутите оси и legend, то в Altair вы просто говорите DataFrame, какую колонку на какую ось положить, что раскрасить и как сделать интерактивным. Библиотека сама строит визуализацию из HTML и JavaScript, которая работает в ноутбуке или сохраняется отдельным файлом.
Real Python советует ставить Altair в выделенное виртуальное окружение: вместе с ним приезжают pandas и Vega-Lite-рендерер, и лучше не мешать их с остальным окружением.
Это не замена Matplotlib. Для пиксельно точных публикационных фигур или 3D по-прежнему стоит брать Matplotlib; для интерактивного исследования в ноутбуке — Altair удобнее.
🔥4