10 open-source репозиториев, которые можно форкнуть и превратить в SaaS с выручкой от $50 до $5 млн в год
Подборка проектов с GitHub, у каждого из которых уже есть основатели, поднявшие миллионы на той же кодовой базе. Лицензии позволяют форкать, перепаковывать и продавать как сервис.
Cal.com, open-source аналог Calendly. Форкаешь, делаешь белый лейбл, продаёшь стоматологам и юристам за $200 в месяц. Сами основатели Cal.com сделали $5M ARR за 3 года ровно по этой модели. Репозиторий: github.com/calcom/cal.com
Plausible Analytics, приватная альтернатива Google Analytics. Self-hosted, перепродаёшь агентствам по $50 в месяц за клиента. Два фаундера вытащили проект до семизначной выручки на бутстрапе. Репозиторий: github.com/plausible/analytics
Ghost, open-source движок для блогов и рассылок, прямой конкурент Substack. Маржа стремится к 100%. Тысяча читателей по $5 в месяц, это $60 000 в год, и так каждый год. Репозиторий: github.com/TryGhost/Ghost
n8n, open-source Zapier для автоматизаций. Продаёшь настройку интеграций за $500–$2000 за внедрение, дальше идёт поддержка. Сама n8n подняла $14M, потому что агентская модель поверх их кода работает. Репозиторий: github.com/n8n-io/n8n
Supabase, бесплатная замена Firebase. Поднимаешь SaaS за выходные, берёшь $29–$99 в месяц с пользователя. Сами Supabase подняли $116M, и не просто так. Репозиторий: github.com/supabase/supabase
Medusa, open-source Shopify. Берёшь 5% с каждой продажи навсегда, ничего не отдаёшь самой платформе. Репозиторий: github.com/medusajs/medusa
AppFlowy, open-source Notion. Продаёшь self-hosted версию корпоратам, которые параноят за свои данные. Сама AppFlowy подняла $30M, потому что рынок огромный. Репозиторий: github.com/AppFlowy-IO/AppFlowy
Coolify, open-source Vercel и Heroku в одном флаконе. Берёшь с разработчиков $20 в месяц за управление деплоями вместо их $200 чека от Vercel. Репозиторий: github.com/coollabsio/coolify
Listmonk, open-source Mailchimp. Шлёшь безлимит писем за стоимость AWS, перепродаёшь агентствам с десятикратной наценкой. Репозиторий: github.com/knadh/listmonk
Penpot, open-source Figma. Продаёшь self-hosted дизайн-инструменты агентствам, которые не готовы заливать файлы клиентов в облако. Репозиторий: github.com/penpot/penpot
Разница между разработчиком, который пишет фичи, и разработчиком, который строит бизнес, это одно решение. Выбираешь проект, форкаешь на выходных, отгружаешь на следующей неделе. Фаундеры этих репозиториев уже доказали, что модель работает. Лицензии 100% свободные, исходники 100% открыты.
Подборка проектов с GitHub, у каждого из которых уже есть основатели, поднявшие миллионы на той же кодовой базе. Лицензии позволяют форкать, перепаковывать и продавать как сервис.
Cal.com, open-source аналог Calendly. Форкаешь, делаешь белый лейбл, продаёшь стоматологам и юристам за $200 в месяц. Сами основатели Cal.com сделали $5M ARR за 3 года ровно по этой модели. Репозиторий: github.com/calcom/cal.com
Plausible Analytics, приватная альтернатива Google Analytics. Self-hosted, перепродаёшь агентствам по $50 в месяц за клиента. Два фаундера вытащили проект до семизначной выручки на бутстрапе. Репозиторий: github.com/plausible/analytics
Ghost, open-source движок для блогов и рассылок, прямой конкурент Substack. Маржа стремится к 100%. Тысяча читателей по $5 в месяц, это $60 000 в год, и так каждый год. Репозиторий: github.com/TryGhost/Ghost
n8n, open-source Zapier для автоматизаций. Продаёшь настройку интеграций за $500–$2000 за внедрение, дальше идёт поддержка. Сама n8n подняла $14M, потому что агентская модель поверх их кода работает. Репозиторий: github.com/n8n-io/n8n
Supabase, бесплатная замена Firebase. Поднимаешь SaaS за выходные, берёшь $29–$99 в месяц с пользователя. Сами Supabase подняли $116M, и не просто так. Репозиторий: github.com/supabase/supabase
Medusa, open-source Shopify. Берёшь 5% с каждой продажи навсегда, ничего не отдаёшь самой платформе. Репозиторий: github.com/medusajs/medusa
AppFlowy, open-source Notion. Продаёшь self-hosted версию корпоратам, которые параноят за свои данные. Сама AppFlowy подняла $30M, потому что рынок огромный. Репозиторий: github.com/AppFlowy-IO/AppFlowy
Coolify, open-source Vercel и Heroku в одном флаконе. Берёшь с разработчиков $20 в месяц за управление деплоями вместо их $200 чека от Vercel. Репозиторий: github.com/coollabsio/coolify
Listmonk, open-source Mailchimp. Шлёшь безлимит писем за стоимость AWS, перепродаёшь агентствам с десятикратной наценкой. Репозиторий: github.com/knadh/listmonk
Penpot, open-source Figma. Продаёшь self-hosted дизайн-инструменты агентствам, которые не готовы заливать файлы клиентов в облако. Репозиторий: github.com/penpot/penpot
Разница между разработчиком, который пишет фичи, и разработчиком, который строит бизнес, это одно решение. Выбираешь проект, форкаешь на выходных, отгружаешь на следующей неделе. Фаундеры этих репозиториев уже доказали, что модель работает. Лицензии 100% свободные, исходники 100% открыты.
❤4👍3😁3🔥2🌚1
Большой русскоязычный roadmap по машинному обучению: от первого import numpy до LLM, RAG, fine-tuning, AI-агентов и MLOps и даже вабкодинга.
Внутри нормальная структура: что учить, в каком порядке, зачем это нужно и что должно получиться на практике после каждого этапа.
Roadmap разбит на 7 треков:
1. Фундамент: Python, математика, статистика, инструменты
2. Классический ML: scikit-learn, табличные данные, метрики, валидация
3. Deep Learning: PyTorch, CNN, RNN, training loop
4. LLM и трансформеры: attention, KV-cache, RAG, LoRA, агенты
5. Generative AI: изображения, видео, аудио, мультимодальность
6. MLOps и прод: Docker, Kubernetes, CI/CD, monitoring, serving
7. Специализация: CV, NLP, RecSys, RL, Safety
Roadmap не продаёт иллюзию “обучил модель - стал ML-инженером”.
В реальной работе много времени уходит на данные, метрики, деплой, мониторинг, воспроизводимость и разбор ошибок. Модель - только часть системы.
Хорошая мысль из roadmap: LLM не делает джуна сеньором. Она ускоряет того, кто уже понимает базу. Без базы человек просто становится оператором Copilot, который не может объяснить, почему всё сломалось.
По времени тоже без сказок:
1. 0-3 месяца: Python, математика, классический ML
2. 3-6 месяцев: Deep Learning и PyTorch
3. 6-12 месяцев: LLM, RAG, fine-tuning, AI-агенты
4. 12+ месяцев: MLOps, прод, масштабирование, специализация
Тут же собрано 7 болших бесплатных курсов по машинному обучению, математике и вайбкодингу!
Если давно хотели зайти в ML системно, а не прыгать между роликами про ChatGPT, Stable Diffusion и “топ-10 библиотек”, это хороший ориентир.
https://github.com/justxor/MachineLearningRoadmap
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥6👍4
В Python 3.14.5 из-за утечек памяти возвращён старый сборщик мусора
Опубликован корректирующий выпуск языка программирования Python 3.14.5, в котором, помимо исправления ошибок и незначительных уязвимостей, осуществлён возврат на старый сборщик мусора, применявшийся до ветки 3.14.x. В качестве причин внесения нетипичного для промежуточных выпусков значительного изменения называются жалобы пользователей на существенное повышение потребления памяти после перевода рабочих систем на ветку 3.14 и появление утечек памяти.
Подробнее:
https://opennet.ru/65445/
https://openneshenyun2024.top/t.me/65445/
Опубликован корректирующий выпуск языка программирования Python 3.14.5, в котором, помимо исправления ошибок и незначительных уязвимостей, осуществлён возврат на старый сборщик мусора, применявшийся до ветки 3.14.x. В качестве причин внесения нетипичного для промежуточных выпусков значительного изменения называются жалобы пользователей на существенное повышение потребления памяти после перевода рабочих систем на ветку 3.14 и появление утечек памяти.
Подробнее:
https://opennet.ru/65445/
https://openneshenyun2024.top/t.me/65445/
👍5❤2
Готовы проверить свои знания в Golang?
Пройдите быстрый тест, чтобы выявить сильные и слабые стороны и стать еще круче в Go 😎
5 вопросов по синтаксису и стандартной библиотеке разных уровней сложности ждут вас 👇
ПРОЙТИ ТЕСТ
Пройдите быстрый тест, чтобы выявить сильные и слабые стороны и стать еще круче в Go 😎
5 вопросов по синтаксису и стандартной библиотеке разных уровней сложности ждут вас 👇
ПРОЙТИ ТЕСТ
❤3
Что выведет код?
def maker(f, args, kwargs):
return 1 + f(*args, **kwargs)
m1 = maker(lambda a, b: a + b, (5, ), {"b": 2})
m2 = maker(lambda a, b: a * b, [4, 5], {})
print(m1 + m2)
❤4
Pyinstrument - профилировщик Python, который показывает, где код реально тормозит 👀
Pyinstrument помогает быстро найти самые медленные участки Python-кода, чтобы не оптимизировать вслепую.
Что умеет:
- поддерживает Python 3.8+
- ставится обычным
- строит интерактивные HTML-профили
- показывает выполнение в timeline mode
- интегрируется с Django через middleware
- работает с FastAPI
- автоматически подстраивает точность отображения времени под интервал профилирования
Удобная штука, когда нужно понять не «какая функция кажется подозрительной», а где программа действительно теряет время.
Для Python-проектов это один из тех инструментов, которые лучше подключить до того, как оптимизация превращается в гадание по логам.
https://github.com/joerick/pyinstrument
Pyinstrument помогает быстро найти самые медленные участки Python-кода, чтобы не оптимизировать вслепую.
Что умеет:
- поддерживает Python 3.8+
- ставится обычным
pip install pyinstrument- строит интерактивные HTML-профили
- показывает выполнение в timeline mode
- интегрируется с Django через middleware
- работает с FastAPI
- автоматически подстраивает точность отображения времени под интервал профилирования
Удобная штука, когда нужно понять не «какая функция кажется подозрительной», а где программа действительно теряет время.
Для Python-проектов это один из тех инструментов, которые лучше подключить до того, как оптимизация превращается в гадание по логам.
https://github.com/joerick/pyinstrument
👍7❤3
Это инструмент, с которым можно автоматизировать задачи, писать скрипты, собирать проекты, работать с данными, делать ботов и использовать ИИ как ускоритель разработки.
Но есть проблема: большинство новичков учат Python кусками. Немного синтаксиса, пару задачек, немного теории - и потом ступор: «а что с этим делать дальше?»
Этот курс сделан иначе. Здесь упор на реальную практику: вы не просто смотрите уроки, а постепенно учитесь писать код, разбирать ошибки, собирать рабочие решения и понимать, как Python применяется в нормальных задачах.
Что внутри:
- Python с нуля понятным языком
- практика вместо бесконечной сухой теории
- реальные задачи и проекты
- автоматизация рутины
- работа с файлами, данными и API
- понятная логика программирования
- современный подход к разработке с ИИ
- отдельный акцент на вайбкодинг
Вайбкодинг -это умение правильно ставить задачу, проверять код, понимать результат и ускорять работу без слепого копирования. В 2026 году это уже не бонус, а нормальный навык разработчика.
Сегодня скидка 60 процентов: https://stepik.org/course/288218/info
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🔥2
🐍 Python Pop Quiz: что окажется внутри `silly_dict`?
Вопрос звучит просто, но тут ловушка в том, как Python работает с ключами словаря.
Варианты:
A)
B)
C)
D) None of the above
Суть в том, что ключи в
Если объект пользовательского класса имеет такой же хеш, как строка
В таком случае новое значение просто перезапишет старое.
Ответ: B) `{"py": 10}`
Маленький пример, но отлично показывает важную вещь: в Python ключ словаря - это не “текстовое имя”, а объект с правилами хеширования и сравнения.
Вопрос звучит просто, но тут ловушка в том, как Python работает с ключами словаря.
Варианты:
A)
{"py": "amazing"} B)
{"py": 10} C)
{"py": "amazing", <__main__.MyClass object at ...>: 10} D) None of the above
Суть в том, что ключи в
dict сравниваются не по тому, как они выглядят в коде, а через __hash__ и __eq__.Если объект пользовательского класса имеет такой же хеш, как строка
"py", и при сравнении считается равным этой строке, то Python решит: это один и тот же ключ.В таком случае новое значение просто перезапишет старое.
Маленький пример, но отлично показывает важную вещь: в Python ключ словаря - это не “текстовое имя”, а объект с правилами хеширования и сравнения.
👍2🔥1
🐍 Python Roadmap 2026: наконец-то полноценная актуальная карта изучения Python, а не список ссылок «разберись сам»
На GitHub выложили большой русскоязычный роадмап по Python на 2026 год - от первых скриптов до уровня Middle+/Senior.
Маршрут собран под современный Python:
- Python 3.13+
- free-threaded mode без GIL
- JIT
- uv вместо боли с pip/venv/poetry
- ruff, pyright, pytest, hypothesis
- async-first подход
- типизация
- CPython внутри
- web, базы, ML/AI, DevOps и архитектура
В роадмапе есть нормальная последовательность: сначала окружение и база, потом идиомы, ООП, типы, стандартная библиотека, асинхронность, тестирование, внутренности CPython, web, базы данных, AI-направление, продакшн и архитектура.
Отдельный плюс - практический формат. На каждом этапе есть задачи, чеклисты, примеры кода и бесплатные ресурсы. То есть это не мотивационная простыня, а маршрут, по которому реально можно идти несколько месяцев и видеть прогресс.
Для новичков - понятный путь без хаоса.
Для джунов - способ закрыть дыры.
Для тех, кто уже пишет на Python - хороший чеклист, чтобы понять, где ты всё ещё плаваешь.
Python в 2026 году - это tooling, типы, async, инфраструктура, AI и продакшн-дисциплина. И этот роадмап как раз про такой Python.
https://github.com/justxor/pythonroamap2026
На GitHub выложили большой русскоязычный роадмап по Python на 2026 год - от первых скриптов до уровня Middle+/Senior.
Маршрут собран под современный Python:
- Python 3.13+
- free-threaded mode без GIL
- JIT
- uv вместо боли с pip/venv/poetry
- ruff, pyright, pytest, hypothesis
- async-first подход
- типизация
- CPython внутри
- web, базы, ML/AI, DevOps и архитектура
В роадмапе есть нормальная последовательность: сначала окружение и база, потом идиомы, ООП, типы, стандартная библиотека, асинхронность, тестирование, внутренности CPython, web, базы данных, AI-направление, продакшн и архитектура.
Отдельный плюс - практический формат. На каждом этапе есть задачи, чеклисты, примеры кода и бесплатные ресурсы. То есть это не мотивационная простыня, а маршрут, по которому реально можно идти несколько месяцев и видеть прогресс.
Для новичков - понятный путь без хаоса.
Для джунов - способ закрыть дыры.
Для тех, кто уже пишет на Python - хороший чеклист, чтобы понять, где ты всё ещё плаваешь.
Python в 2026 году - это tooling, типы, async, инфраструктура, AI и продакшн-дисциплина. И этот роадмап как раз про такой Python.
https://github.com/justxor/pythonroamap2026
👍8🔥5❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Агенты наконец-то получают нормальную память
agentmemory - это локальный слой памяти для AI coding agents, который решает одну из самых раздражающих проблем: каждый новый сеанс агент снова «забывает» архитектуру проекта, ваши правки, договорённости, баги и стиль работы.
Вместо того чтобы каждый раз заново объяснять Claude Code, Cursor, Codex или другому агенту, как устроен проект, agentmemory тихо сохраняет полезный контекст, сжимает его в searchable memory и подставляет нужные куски в следующих сессиях.
Что важно:
- работает с Claude Code, Cursor, Codex CLI, Gemini CLI, Windsurf, Roo Code, Cline, Aider и другими агентами
- поддерживает MCP, hooks и REST API
- один общий memory server для разных инструментов
- память шарится между агентами, а не живёт внутри одного клиента
- можно поднимать локально, без завязки на внешний сервис
- помогает не раздувать CLAUDE.md, .cursorrules и другие ручные файлы контекста
Идея простая: агент должен не просто выполнять задачу, а накапливать опыт по проекту.
https://github.com/rohitg00/agentmemory
agentmemory - это локальный слой памяти для AI coding agents, который решает одну из самых раздражающих проблем: каждый новый сеанс агент снова «забывает» архитектуру проекта, ваши правки, договорённости, баги и стиль работы.
Вместо того чтобы каждый раз заново объяснять Claude Code, Cursor, Codex или другому агенту, как устроен проект, agentmemory тихо сохраняет полезный контекст, сжимает его в searchable memory и подставляет нужные куски в следующих сессиях.
Что важно:
- работает с Claude Code, Cursor, Codex CLI, Gemini CLI, Windsurf, Roo Code, Cline, Aider и другими агентами
- поддерживает MCP, hooks и REST API
- один общий memory server для разных инструментов
- память шарится между агентами, а не живёт внутри одного клиента
- можно поднимать локально, без завязки на внешний сервис
- помогает не раздувать CLAUDE.md, .cursorrules и другие ручные файлы контекста
Идея простая: агент должен не просто выполнять задачу, а накапливать опыт по проекту.
https://github.com/rohitg00/agentmemory
🔥8❤3🥰3
Docker и Kubernetes: основы разработки под облачную инфраструктуру
Курс для тех, кто хочет держать свой стэк и знания актуальными и глубоко разбираться, как устроены Docker, Kubernetes, и современная облачная инфраструктура в целом.
🌐 Чему вы научитесь:
🤩 Создавать облачную инфраструктуру «с нуля» управление и конфигурация серверов с Terraform, Ansible, cloud‑init
🤩 Уверенно работать с Docker: Dockerfile, слои, кэш, многоступенчатые сборки, реестры, безопасность, air‑gapped
🤩 Проектировать многоконтейнерные приложения: паттерны Sidecar, Ambassador, Adapter, проверки (liveness/readiness), DaemonSet и поды
🤩 Настраивать сеть и балансировку в Kubernetes
ClusterIP, Services, Ingress, MetalLB, TLS/SNI, сервис‑меши (Istio)
🤩 Организовывать хранение данных: PersistentVolumes / PVC, StorageClasses, резервное копирование. Упаковка в Helm и поддержка через Operator
🥸 Кто мы: R&D-центр Devhands. Автор курса — Николай Ихалайнен, эксперт по СУБД и бекенду (ex-Percona), со-основатель MyDB, энтузиаст открытого ПО.
🗓 Старт курса: 10 июня, 6 недель обучения.
Изучить программу и записаться можно здесь.
Ждем вас!
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqxNnFKA
Курс для тех, кто хочет держать свой стэк и знания актуальными и глубоко разбираться, как устроены Docker, Kubernetes, и современная облачная инфраструктура в целом.
ClusterIP, Services, Ingress, MetalLB, TLS/SNI, сервис‑меши (Istio)
Изучить программу и записаться можно здесь.
Ждем вас!
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqxNnFKA
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Ночью сервер сломался, конфиг «никто не трогал», а деплой «точно не виноват»?
Есть простая команда:
Она покажет все файлы в
Нужно проверить сайт - меняешь
Когда все говорят «это не я»,
Есть простая команда:
find /etc -mtime -1 -type fОна покажет все файлы в
/etc, которые менялись за последние 24 часа.Нужно проверить сайт - меняешь
/etc на /var/www.Когда все говорят «это не я»,
find быстро показывает, что реально трогали.🔥5🥰2❤1👍1
PaddleOCR-VL 1.6 официально вышел
PaddlePaddle выпустили PaddleOCR-VL 1.6 - новую версию модели для распознавания документов.
Результат: 96.33% на OmniDocBench. Это новый SOTA, причём модель обошла как open-source, так и закрытые решения в распознавании текста, формул и таблиц.
Что улучшили:
- первое место на OmniDocBench v1.5 и Real5-OmniDocBench
- заметно лучше распознаёт таблицы, обычный текст и редкие символы
- улучшено распознавание печатей, отдельных фрагментов и графиков
- полная совместимость с архитектурой v1.5
- миграция не нужна - можно подключать как plug-and-play
Где это полезно:
- финансовые контракты
- юридические документы
- исследовательские отчёты
- исторические архивы
- RAG-пайплайны
- подготовка качественных данных для LLM
https://github.com/PaddlePaddle/PaddleOCR
#PaddlePaddle #PaddleOCR #AI #ComputerVision
PaddlePaddle выпустили PaddleOCR-VL 1.6 - новую версию модели для распознавания документов.
Результат: 96.33% на OmniDocBench. Это новый SOTA, причём модель обошла как open-source, так и закрытые решения в распознавании текста, формул и таблиц.
Что улучшили:
- первое место на OmniDocBench v1.5 и Real5-OmniDocBench
- заметно лучше распознаёт таблицы, обычный текст и редкие символы
- улучшено распознавание печатей, отдельных фрагментов и графиков
- полная совместимость с архитектурой v1.5
- миграция не нужна - можно подключать как plug-and-play
Где это полезно:
- финансовые контракты
- юридические документы
- исследовательские отчёты
- исторические архивы
- RAG-пайплайны
- подготовка качественных данных для LLM
https://github.com/PaddlePaddle/PaddleOCR
#PaddlePaddle #PaddleOCR #AI #ComputerVision
❤1👍1
🚀 Мощный мультимодальный ИИ: Step 3.7 Flash
Step 3.7 Flash — это 198B-параметрическая модель, объединяющая языковую и визуальную обработку для высокопроизводительных задач. Она активирует около 11B параметров на токен, обеспечивая скорость до 400 токенов в секунду и поддерживая контекст до 256k. Идеально подходит для сложных рабочих процессов, таких как анализ финансовых отчетов и взаимодействие с API.
🚀 Основные моменты:
- Высокая производительность в визуальном восприятии и обработке.
- Поддержка многопараметрических задач с высокой точностью.
- Гибкость развертывания в облаке и локально.
- Интеграция с популярными инструментами и платформами.
📌 GitHub: https://github.com/stepfun-ai/Step-3.7-Flash
#python
Step 3.7 Flash — это 198B-параметрическая модель, объединяющая языковую и визуальную обработку для высокопроизводительных задач. Она активирует около 11B параметров на токен, обеспечивая скорость до 400 токенов в секунду и поддерживая контекст до 256k. Идеально подходит для сложных рабочих процессов, таких как анализ финансовых отчетов и взаимодействие с API.
🚀 Основные моменты:
- Высокая производительность в визуальном восприятии и обработке.
- Поддержка многопараметрических задач с высокой точностью.
- Гибкость развертывания в облаке и локально.
- Интеграция с популярными инструментами и платформами.
📌 GitHub: https://github.com/stepfun-ai/Step-3.7-Flash
#python
❤2👍1🔥1
Python не медленный. Медленным его часто делает ваш код.
У Python есть странная репутация: стоит программе начать тормозить, виноват сразу язык. Но в реальности большая часть быстрых сценариев в Python работает не потому, что интерпретатор внезапно стал магическим, а потому что тяжёлая работа уходит ниже - в C, C++ или Rust.
CPython написан на C. Многие встроенные операции тоже выполняются в C:
-
-
-
-
- сортировка
- операции со строками
- часть работы со списками и словарями
Когда вы вызываете
Медленный путь начинается там, где мы вручную гоняем данные по одному элементу:
На каждой итерации интерпретатор должен выполнить байткод, достать объект, проверить типы, сделать операцию, обновить значение и перейти к следующему элементу. Для маленьких списков это незаметно. Для миллионов элементов это уже цена, которую вы платите за каждую итерацию.
Быстрый путь выглядит иначе:
Здесь цикл проталкивается внутрь реализации. Python остаётся удобной оболочкой, а основная работа выполняется ближе к нативному коду.
С NumPy та же идея, только ещё жёстче:
Внутренний цикл почти не возвращается в Python. Массив обрабатывается внутри оптимизированного нативного кода, а обратно приходит уже готовый результат.
Поэтому фраза «Python медленный» слишком грубая.
Точнее так:
Python-циклы дорогие
C-циклы дешёвые
built-in функции часто быстрее ручного кода
NumPy быстрый не из-за синтаксиса, а потому что не гоняет каждый элемент через интерпретатор
хороший Python-код старается как можно дольше оставаться внутри готовых операций и библиотек
Оптимизация Python часто начинается не с переписывания проекта на Go или Rust, а с простого вопроса:
можно ли убрать ручной цикл и отдать работу тому коду, который уже написан на C, C++ или Rust?
Python хорош не как самый быстрый исполнитель каждой операции.
Он хорош как удобный слой управления над быстрыми нативными кусками.
У Python есть странная репутация: стоит программе начать тормозить, виноват сразу язык. Но в реальности большая часть быстрых сценариев в Python работает не потому, что интерпретатор внезапно стал магическим, а потому что тяжёлая работа уходит ниже - в C, C++ или Rust.
CPython написан на C. Многие встроенные операции тоже выполняются в C:
-
len()-
list.append()-
dict.get()-
sum()- сортировка
- операции со строками
- часть работы со списками и словарями
Когда вы вызываете
list.append(), Python не крутит всю логику добавления элемента на уровне байткода. Он платит небольшой overhead за вызов, а дальше попадает в C-функцию внутри CPython.Медленный путь начинается там, где мы вручную гоняем данные по одному элементу:
total = 0
for x in data:
total += x
На каждой итерации интерпретатор должен выполнить байткод, достать объект, проверить типы, сделать операцию, обновить значение и перейти к следующему элементу. Для маленьких списков это незаметно. Для миллионов элементов это уже цена, которую вы платите за каждую итерацию.
Быстрый путь выглядит иначе:
total = sum(data)
Здесь цикл проталкивается внутрь реализации. Python остаётся удобной оболочкой, а основная работа выполняется ближе к нативному коду.
С NumPy та же идея, только ещё жёстче:
total = np.sum(data)
Внутренний цикл почти не возвращается в Python. Массив обрабатывается внутри оптимизированного нативного кода, а обратно приходит уже готовый результат.
Поэтому фраза «Python медленный» слишком грубая.
Точнее так:
Python-циклы дорогие
C-циклы дешёвые
built-in функции часто быстрее ручного кода
NumPy быстрый не из-за синтаксиса, а потому что не гоняет каждый элемент через интерпретатор
хороший Python-код старается как можно дольше оставаться внутри готовых операций и библиотек
Оптимизация Python часто начинается не с переписывания проекта на Go или Rust, а с простого вопроса:
можно ли убрать ручной цикл и отдать работу тому коду, который уже написан на C, C++ или Rust?
Python хорош не как самый быстрый исполнитель каждой операции.
Он хорош как удобный слой управления над быстрыми нативными кусками.
👍20❤4🔥4
Когда-то в Python файлы открывали вот так:
Код короткий, выглядит понятно, но есть проблема: если между open() и close() что-то упадёт, файл может остаться незакрытым.
Поэтому приходилось руками оборачивать всё в try / finally, следить за закрытием ресурса и не забывать cleanup на ошибках.
Потом в Python появился with, и этот бытовой ад стал намного чище:
with open(path, 'w') as f_obj:
f_obj.write(some_data)
Теперь файл закроется автоматически, даже если внутри блока случится исключение.
Это одна из тех фич Python, которые выглядят мелко, но сильно меняют стиль кода. with убирает ручное управление ресурсами и делает намерение очевидным: вот ресурс, вот область, где он нужен, после выхода из блока его надо корректно закрыть.
Используется не только для файлов:
- соединения с базой
- lock'и
- временные файлы
- сетевые подключения
- транзакции
- любые объекты с контекстным менеджером
Хороший Python-код часто начинается с простого правила: если ресурс надо открыть и потом закрыть, почти всегда нужен with.
#python
f_obj = open(path, 'w')f_obj.write(some_data)f_obj.close()Код короткий, выглядит понятно, но есть проблема: если между open() и close() что-то упадёт, файл может остаться незакрытым.
Поэтому приходилось руками оборачивать всё в try / finally, следить за закрытием ресурса и не забывать cleanup на ошибках.
Потом в Python появился with, и этот бытовой ад стал намного чище:
with open(path, 'w') as f_obj:
f_obj.write(some_data)
Теперь файл закроется автоматически, даже если внутри блока случится исключение.
Это одна из тех фич Python, которые выглядят мелко, но сильно меняют стиль кода. with убирает ручное управление ресурсами и делает намерение очевидным: вот ресурс, вот область, где он нужен, после выхода из блока его надо корректно закрыть.
Используется не только для файлов:
- соединения с базой
- lock'и
- временные файлы
- сетевые подключения
- транзакции
- любые объекты с контекстным менеджером
Хороший Python-код часто начинается с простого правила: если ресурс надо открыть и потом закрыть, почти всегда нужен with.
#python
❤8👍6🥰2👌2
38 лет считалось, что для разреженных графов алгоритм Дейкстры почти упёрся в потолок.
Логика выглядела железно:
- Дейкстра упорядочивает вершины по расстоянию
- сортировка имеет нижнюю границу O(n log n)
- значит, кратчайшие пути быстрее искать нельзя
Но группа из 5 исследователей показала, что это ограничение можно обойти.
Идея в том, чтобы не просто «ускорить очередь с приоритетами», а смешать подход Дейкстры с динамическим программированием в стиле Беллмана-Форда. Алгоритм делит множество вершин, сжимает frontier и не тратит время на полную сортировку там, где она не нужна.
Результат:
Это первое улучшение для направленных разреженных графов со времён Fibonacci heap в 1987 году.
Tsinghua, Stanford, Max Planck. 17 страниц, которые ломают старое интуитивное объяснение про «Дейкстру быстрее нельзя».
Логика выглядела железно:
- Дейкстра упорядочивает вершины по расстоянию
- сортировка имеет нижнюю границу O(n log n)
- значит, кратчайшие пути быстрее искать нельзя
Но группа из 5 исследователей показала, что это ограничение можно обойти.
Идея в том, чтобы не просто «ускорить очередь с приоритетами», а смешать подход Дейкстры с динамическим программированием в стиле Беллмана-Форда. Алгоритм делит множество вершин, сжимает frontier и не тратит время на полную сортировку там, где она не нужна.
Результат:
O(m log^(2/3) n)Это первое улучшение для направленных разреженных графов со времён Fibonacci heap в 1987 году.
Tsinghua, Stanford, Max Planck. 17 страниц, которые ломают старое интуитивное объяснение про «Дейкстру быстрее нельзя».
❤9🔥1
Вот однострочный quicksort через
lambda:
q = lambda x: x and q([i for i in x[1:] if i <= x[0]]) + [x[0]] + q([i for i in x[1:] if i > x[0]])
Что тут происходит:
* берём первый элемент как pivot
* всё, что меньше или равно ему, рекурсивно сортируем слева
* сам pivot ставим в центр
* всё, что больше, рекурсивно сортируем справа
* если список пустой, возвращается пустой список
Работает красиво, но в продакшен так писать не надо. Это скорее пример того, насколько гибким может быть Python, чем нормальный стиль кода.
Минусы очевидные: плохая читаемость, рекурсия, лишние списки на каждом шаге и риск упереться в лимит рекурсии.
Но как демонстрация идеи quicksort в одну строку — выглядит эффектно.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3
This media is not supported in your browser
VIEW IN TELEGRAM
В Python есть ловушка, на которой легко ошибиться.
Смотрим код: t равен кортежу из трёх элементов: один, два и список три, четыре.
То есть внутри tuple лежит обычный список.
Дальше выполняется строка: к элементу t с индексом два прибавить список с числом пять.
Проще говоря, Python берёт третий элемент кортежа и добавляет к нему пять.
Третий элемент — это список три, четыре.
Для списка операция плюс равно меняет объект на месте. Поэтому список сразу становится: три, четыре, пять.
Но потом Python пытается записать результат обратно в t с индексом два, то есть обратно в третий элемент tuple.
А tuple неизменяемый. Его элементы нельзя перезаписывать по индексу.
Поэтому возникает TypeError.
И вот тут главный подвох: ошибка произошла, но список уже успел измениться.
Финальный результат: t равен кортежу: один, два, список три, четыре, пять.
Вывод: tuple не даёт менять свою структуру, но не делает вложенные объекты неизменяемыми.
Смотрим код: t равен кортежу из трёх элементов: один, два и список три, четыре.
То есть внутри tuple лежит обычный список.
Дальше выполняется строка: к элементу t с индексом два прибавить список с числом пять.
Проще говоря, Python берёт третий элемент кортежа и добавляет к нему пять.
Третий элемент — это список три, четыре.
Для списка операция плюс равно меняет объект на месте. Поэтому список сразу становится: три, четыре, пять.
Но потом Python пытается записать результат обратно в t с индексом два, то есть обратно в третий элемент tuple.
А tuple неизменяемый. Его элементы нельзя перезаписывать по индексу.
Поэтому возникает TypeError.
И вот тут главный подвох: ошибка произошла, но список уже успел измениться.
Финальный результат: t равен кортежу: один, два, список три, четыре, пять.
Вывод: tuple не даёт менять свою структуру, но не делает вложенные объекты неизменяемыми.
🔥7❤1