PythonTalk
4.77K subscribers
1.46K photos
49 videos
7 files
1.32K links
Привет, меня зовут Олег Булыгин 👋

🐍 Здесь я делюсь полезной информацией для тех, кто пишет код на Python: от разработки до Data Science.

По вопросам: @obulygin91
Download Telegram
🐍 Анатомия генератора в Python: раскрываем магию yield!

В статье залазим под капот генераторов и yield. Покажем, как эта парочка помогает писать эффективный код, экономить RAM (и ваши нервы!) при работе с гигантскими файлами, потоками данных и сложными пайплайнами. Залетайте! 🚀
3👍2🔥1🙏11
✍️ Решения вчерашней задачи

🏆 Эталон эффективности: алгоритм "черепахи и зайца"

Этот подход является классикой для поиска циклов в последовательностях и обладает лучшей эффективностью по памяти — O(1):

def get_next(n: int) -> int:
total_sum = 0
while n > 0:
n, digit = divmod(n, 10)
total_sum += digit ** 2
return total_sum

def is_happy(n: int) -> bool:
slow_pointer = n
fast_pointer = get_next(n)

while fast_pointer != 1 and slow_pointer != fast_pointer:
slow_pointer = get_next(slow_pointer)
fast_pointer = get_next(get_next(fast_pointer))

return fast_pointer == 1


🤔 Как это работает?

1. Представьте гоночный трек (наша последовательность чисел). Он может быть как прямой (ведет к 1), так и кольцевым (мы попали в цикл).
2. Мы запускаем двух бегунов: "черепаху" (slow_pointer) и "зайца" (fast_pointer).
3. Черепаха делает один шаг за раз (get_next).
4. Заяц делает два шага за раз (get_next(get_next(...))).
5. Исход:
* Если трек прямой (число счастливое), "заяц" просто первым доберется до финиша (1).
* Если трек кольцевой (число несчастливое), "заяц" неизбежно догонит и "перепрыгнет" черепаху, встретившись с ней на одном из витков цикла (slow_pointer == fast_pointer).

Время: O(L * log N), где L — длина последовательности до цикла.
Память: O(1). Мы не храним историю, нам нужны лишь две переменные!


🐍 Самое идиоматичное решение

Такой алгоритм идеально сочетает читаемость, простоту и эффективность, используя встроенные возможности Python.

def is_happy(n: int) -> bool:
seen = set()
while n != 1 and n not in seen:
seen.add(n)
n = sum(int(digit) ** 2 for digit in str(n))
return n == 1


🤔 Как это работает?

1. Мы создаем "карту" — пустое множество seen, где будем отмечать все числа-шаги, которые уже прошли.
2. На каждом шаге проверяем: не были ли мы здесь раньше (n not in seen)?
* Если нет — добавляем текущее число на карту (seen.add(n)) и вычисляем следующее.
* Если да — мы попали в цикл! Прерываем путешествие.
3. После выхода из цикла просто проверяем, почему мы остановились. Если n == 1, то число счастливое.

Время: O(L * log N).
Память: O(L). В худшем случае нам придется хранить в seen все числа из последовательности до цикла. Это небольшой компромисс ради простоты кода.

💡 Бонус: математическая оптимизация

Такой хитрый подход основан на свойствах этой последовательности и быстрой математике вместо строковых операций.

def is_happy(n: int) -> bool:
while True:
if n == 1 or n == 7: # 7 -> 49 -> 97 -> ... -> 1
return True
if n < 10:
return False

next_n = 0
while n > 0:
digit = n % 10
next_n += digit * digit
n //= 10
n = next_n


🤔 В чем магия?
* Любая последовательность рано или поздно приходит к числу с одной цифрой.
* Из всех однозначных чисел только 1 и 7 в итоге приводят к 1. Все остальные попадают в цикл 4 -> 16 -> ... -> 4.
* Поэтому можно просто проверять эти конечные состояния.
* А использование математических операций n % 10 и n //= 10 для извлечения цифр, как правило, работает быстрее, чем преобразование в строку str(n).
13👍21🔥1🙏1🦄1
🗓Итоги месяца (июнь 2025)

👀 Топ по просмотрам 👨🏻‍💻
1️⃣ Статистика из США по высокой безработице среди выпускников IT-специальностей.
2️⃣ Утилита для исправление опечаток при помощи факов.
3️⃣ Новость о том, как в компании Canva теперь требуют использования AI-помощников.

📨 Топ по репостам 📥
1️⃣ Огромная подборка бесплатных тренажёров по SQL.
2️⃣ Релиз ИИ-помощника для командной строки Gemini CLI.
3️⃣ Релиз функционала подтверждения IT-компетенций на Госуслугах.

👍🏻 Топ по реакциям 😍
1️⃣ Как обычно, мемчик.
2️⃣ Сказ о том, как ИИ спас прогера-индуса от увольнения.
3️⃣ Исследование Mamba о том, что айтишники уже не в тренде привлекательности.
🙏21👍1🔥11
Прошёл очередной квартал, пора смотреть, что там с зарплатами питонистов по данным Getmatch 🤑

А смотреть особо не на что, в этот раз очень скучно. Изменений, можно сказать, нет. А это значит, что реальный доход по факту падает.

▪️ Медианная зарплата по всем уровням – 200к
▫️ Джуны – 100к
▫️ Мидлы – 190к
▫️ Синьоры – 300к
▫️ Тимлиды – 350к

▫️ В Москве медиана по всем уровням – 210к
▫️ Питер – 200к
▫️ Остальные города – 200к (было 180)

⬆️ Медиана по зарплатам для тех, кто работает в офисе или гибридно – 197к. Было 190, это единственный пункт с ростом.
▫️ Удалёнщики – 220к
👍32🔥1🙏11
Baidu выкатил ERNIE 4.5 🇨🇳

И это не одна модель, а целое семейство из 10 разных вариантов мультимодальных моделей.

Чего там интересного?
1️⃣ Мультимодальная MoE-архитектура. По-простому — научили модели работать с текстом, картинками и даже видео одновременно, да так, чтобы модальности не мешали, а помогали друг другу. Заявляют, что от этого даже чисто текстовые задачи стали решаться лучше.
2️⃣ Размер на любой вкус. Есть варианты от гиганта на 424B параметров (47B активных) до малютки на 0.3B. Есть где разгуляться и тем, у кого свой кластер, и тем, кто на ноутбуке код запускает.
3️⃣ SOTA-результаты. Ну тут классика. Говорят, что обогнали всех на свете в следовании инструкциям, визуальном понимании и прочих модных бенчмарках. Как обычно, доверяем, но проверяем.
4️⃣ Полный инструментарий. Отдали не только веса, но и тулкиты для дообучения (ERNIEKit) и быстрого деплоя (FastDeploy). Всё под лицензией Apache 2.0.

Всё это добро работает на их собственном фреймворке PaddlePaddle. Так что, фанатам PyTorch придётся либо немного пострадать, либо проходить мимо. Интересный способ продвигать свою экосистему 🌚

Ссылочки:
👉🏻 Hugging Face
👉🏻 AI Studio
👉🏻 GitHub
👍51🔥1🙏11
5👍53🔥2🗿21🙏1👨‍💻1
Управление циклами в Python: break, continue и неочевидный else 🐍

Все мы каждый день используем циклы for и while. Но что, если стандартного "пройти по всем" или "повторять до условия" становится недостаточно? 🤔 Как элегантно прервать выполнение, проигнорировать текущий шаг или выполнить код, только если цикл завершился без сюрпризов?

Для этого в Python есть break, continue и, возможно, не самый очевидный для многих, блок else в связке с циклами! 🤯 Да, этот else – не тот, что с if.

Когда эти инструменты делают код чище и эффективнее, а когда превращают его в спагетти-монстра? 🍝

Залетайте в свежий разбор, чтобы узнать все тонкости, посмотреть на практические примеры и понять, как не наступить на грабли! 🧑🏻‍💻
👍73🔥211🙏1🤗11
🎓 Книга по ML от Себастьяна Рашки

Есть такой Себастьян Рашка — если вы в теме, то знаете, что это core-разработчик Scikit-learn и автор нескольких культовых книжек по машинному обучению. Так вот, у него есть отличная книга Machine Learning Q and AI.

Это не очередной талмуд для начинающих, а чтиво для тех, кто уже перерос «Грокаем алгоритмы», но до полноценного чтения пейперов ещё не дорос.

Что внутри:
▫️ 30 глав в формате «вопрос-ответ» по нейросетям, CV, LLM, оценке и деплою.
▫️ Разбор тем вроде multi-GPU обучения, файнтюнинга трансформеров и Vision Transformers.
▫️ Всё с диаграммами, примерами кода на Python и упражнениями.

Книга есть в открытом доступе, а все допматериалы и код лежат в репозитории.
👍64🔥31🙏1🤗1
Очень лаконичное тестовое на позицию дата-сайентиста в МТС 🧑‍💻

По ссылке лежат данные по оттоку абонентов в телекоме. Целевая переменная – churn (показатель оттока). Нужно построить модель, предсказывающую отток абонентов, оценить качество этой модели и гипотетические перспективы её использования в реальном бизнес-процессе. Дополнительной информации об этом датасете нет (ну и не надо), названия столбцов хорошо отражают их содержание, так что справитесь.

#тестовое |⚡️ Забустить канал 🚀
🔥4👍3👨‍💻21🤔1🙏1
🗺 Карта машинного обучения: вся база в одной картинке

Постоянно вижу, как у начинающих в голове полная каша из алгоритмов, методов и терминов. Одни думают, что ML — это только нейронки, другие не отличают классификацию от кластеризации.

Чтобы навести порядок в головах, сделал вот такую шпаргалку, которая раскладывает по полочкам всё основное, что есть в машинном обучении. От классики до продвинутых штук вроде трансформеров.

Сохранить pdf в норм качестве можно по ссылке.

Кстати, по некоторым из этих тем у меня уже есть статьи:

▫️Линейная регрессия и её регуляризация в Scikit-learn — это база из блока «Обучение с учителем». Про полиномиальную регрессию тоже есть отдельный материал.
▫️ PCA или метод главных компонент — мощная штука для «Снижения размерности» из блока «Обучение без учителя».
65👍4🔥322👎1🥰1🙏1
🖼 Собираем нейронку для генерации картинок на коленке

Нейронки, которые рисуют картинки по тексту, сейчас везде. Но большинство просто дёргает API, не имея ни малейшего понятия, что там под капотом условного Stable Diffusion.

Для тех, кто хочет разобраться, есть проект miniDiffusion — это полная перереализация Stable Diffusion 3.5, написанная с нуля на чистом PyTorch.

👉🏻 Всего ~2800 строк кода. От VAE и текстовых энкодеров до самого DiT и скриптов для обучения.
👉🏻 Никаких лишних зависимостей. Только PyTorch и необходимый минимум.
👉🏻 Внутри всё самое важное: архитектура DiT, Joint Attention, энкодеры T5 и CLIP, планировщик шума и даже расчёт метрики FID.

Кому это надо?
▫️ Для тех, кто хочет реально разобраться, как эта магия генерации картинок работает под капотом.
▫️ Для тех, кто хочет поковырять архитектуру или обучить что-то своё, не продавая душу дьяволу за понимание официальной репы.

Заглянуть в код можно здесь 👈🏻
42🙏21👍1🤔1👌1
🗺 Заблудились в технологиях? Для вас есть карта

Многие начинающие (и не только) часто тонут в бесконечном потоке фреймворков, библиотек и технологий, которые «надо знать». В итоге в голове не дорожная карта, а каша из buzzwords.

Для тех, кто хочет хоть как-то структурировать свой путь и понять, сколько всего ему ещё предстоит выучить (и ужаснуться), есть отличный сервис — roadmap.sh.

Там много подробных карты развития по разным направлениям. Вот несколько👇🏻
1️⃣ Python
2️⃣ Backend
3️⃣ DevOps
4️⃣ AI & Data Scientist
5️⃣ SQL

Все эти карты показывают объём знаний, необходимый для того, чтобы стать хоть сколько-нибудь вменяемым специалистом 🌚
На все блоки можно потыкать, прочитать про каждый навык на полезных ссылках.

Выбирайте свой путь развития и узнавайте, какие навыки нужно прокачивать до конца жизни во время получения lvl up-ов.
Класс, дуал-класс или мультикласс? На всё скилл-поинтов точно не хватит 🧙🏼‍♂️
4👍221
🏋️‍♂️ Миссия: сбалансировать нагрузку!

Представьте, что вы менеджер проекта. У вас есть список последовательных задач nums, каждая со своей оценкой трудоемкости (в часах). Вам нужно распределить все эти задачи между k разработчиками.

Правила распределения:
* Каждый разработчик получает непрерывный блок задач из списка.
* Каждый из k разработчиков должен получить хотя бы одну задачу.

Ваша цель — распределить задачи так, чтобы самый загруженный разработчик (тот, у кого суммарная трудоемкость задач наибольшая) потратил как можно меньше времени. Вам нужно вернуть это минимально возможное время самого загруженного разработчика.

🎯 Задача:
Написать функцию split_array(nums: list[int], k: int) -> int, которая разбивает nums на k непустых непрерывных подсписков и возвращает минимально возможную наибольшую сумму среди этих подсписков.

Пример 1:
nums = [7, 2, 5, 10, 8], k = 2
Нужно разделить задачи между двумя разработчиками.

* Вариант 1: [7] | [2, 5, 10, 8]. Нагрузка: 7 и 25. Максимальная нагрузка: 25.
* Вариант 2: [7, 2] | [5, 10, 8]. Нагрузка: 9 и 23. Максимальная нагрузка: 23.
* Вариант 3: [7, 2, 5] | [10, 8]. Нагрузка: 14 и 18. Максимальная нагрузка: 18.
* Вариант 4: [7, 2, 5, 10] | [8]. Нагрузка: 24 и 8. Максимальная нагрузка: 24.

Сравниваем максимальные нагрузки: 25, 23, 18, 24. Самая маленькая из них — 18.
➡️ Результат: 18.

Пример 2:
nums = [1, 2, 3, 4, 5], k = 2
* Оптимальное разделение: [1, 2, 3] | [4, 5].
* Нагрузка: 6 и 9. Максимальная нагрузка: 9.
➡️ Результат: 9.

Присылайте решения в комменты 👇🏻
👨‍💻2👍1🔥1🤔1
AI больше не опция. Теперь это приказ👺

Новость-огонь из стана Microsoft. По данным Business Insider, корпорация добра теперь будет учитывать использование своих же AI-инструментов при оценке перформанса сотрудников.

Президент дев-дивизиона Джулия Льюсон прямо так и написала в письме менеджерам:

> «Использование ИИ больше не является опциональным — это основа для каждой роли и каждого уровня».


Говоря по-простому: не нагенерил в GitHub Copilot положенную норму — жди интересных бесед на ревью.

Причина проста до безобразия: сотрудники не очень-то торопятся использовать внутренние AI-сервисы, а тем временем конкуренты вроде Cursor откусывают долю рынка.

Классический менеджерский ход: когда не можешь сделать продукт, которым хочется пользоваться, — просто введи KPI на его использование 🌝
😁7🤯3😱222👍1🤔1🌚1👨‍💻1👀1
Моржовый оператор в Python: полный гайд от основ до хардкорных трюков 🦭

С момента своего появления := успел стать предметом настоящих холиваров. Одни считают его бесполезным синтаксическим сахаром, другие — мощным инструментом для элегантного кода.

Так где же правда? 🤔

Давайте разложим всё по полочкам и разберём не только каноничные примеры с while и list comprehensions, но и копнём глубже:
- 🔥 трюки с any()/all() и f-строками.
- 🤯 Как «морж» помогает в накопительных вычислениях.
- 👺 И, конечно, тёмная сторона: где можно больно выстрелить себе в ногу, попав в ловушки с областью видимости и «ленивыми» вычислениями.

Обо всём этом читайте в статье 👈🏻
1👍721🔥1🙏1🤓1👨‍💻11
✍️ Решения вчерашней задачи

Это классическая задача на "минимизацию максимума", которая идеально решается через бинарный поиск. Это самое эффективное решение по сложности.

def split_array(nums: list[int], k: int) -> int:
def can_split(capacity: int) -> bool:
developers_needed = 1
current_load = 0
for task in nums:
if task > capacity:
return False

if current_load + task <= capacity:
current_load += task
else:
developers_needed += 1
current_load = task

return developers_needed <= k

left, right = max(nums), sum(nums)
ans = right

while left <= right:
mid_capacity = (left + right) // 2
if can_split(mid_capacity):
ans = mid_capacity
right = mid_capacity - 1
else:
left = mid_capacity + 1

return ans


🤔 Как это работает?

Вместо того чтобы перебирать все возможные разбиения, мы ищем бинарным поиском сам ответ — минимально возможную нагрузку на самого занятого разработчика.

1. Определяем границы ↔️
- Минимально возможный ответ не может быть меньше самой большой задачи (left = max(nums)).
- Максимально возможный ответ — это когда все задачи достаются одному разработчику (right = sum(nums)).

2. Проверяем гипотезу 🙋
- Берем среднее значение mid_capacity из нашего диапазона [left, right]. Это наша гипотеза: "А можем ли мы разбить задачи так, чтобы ни у кого не было нагрузки больше mid_capacity?".
- Для проверки пишем жадную функцию can_split: она идет по задачам и формирует группы, не превышая лимит mid_capacity. Если для этого потребовалось k или меньше разработчиков — значит, гипотеза верна.

3. Сужаем диапазон 🔎
- Если can_split(mid_capacity) вернула True, значит, такая нагрузка возможна. Мы запоминаем этот удачный результат (ans = mid_capacity) и пытаемся найти еще лучше (меньше): right = mid_capacity - 1.
- Если False — значит, лимит слишком жесткий. Нужно его ослабить: left = mid_capacity + 1.

Этот цикл продолжается, пока left не станет больше right, а в ans останется наилучший из найденных результатов.

📈 Сложность: Время — O(N * log(S)), где N — количество задач, а S — их суммарная трудоемкость. Пространство — O(1).
👍22🔥1👨‍💻1
Король хакатонов, который не умеет программировать 👑

Знакомьтесь, Рене Турсиос. Этот парень за два года посетил 200+ хакатонов и пачками забирал призовые. Прикол в том, что он сам не написал ни строчки кода.

Его секрет? Вайб-кодинг 👨‍💻 Да, он просто мастерски промптил AI-инструменты задолго до того, как это стало мейнстримом.

Чувак — бывший про-игрок в Yu-Gi-Oh!, он привык искать и абьюзить мету. Сначала в картонках, теперь — в IT.

Сейчас он в соло, без единого нанятого разраба, пилит собственный AI-стартап.

Разработчик? Программист? Или надо какое-то новое слово придумывать?
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔8👍3🏆3🔥2😱21👨‍💻11
Делаем подкасты из репозиториев 🎧

Опенсорсный проект GitPodcast превращает любой GitHub-репозиторий в... подкаст! Просто меняете hub на podcast в URL репы – и вуаля, можно слушать полезное о проекте.

🧑‍💻Технологии под капотом: backend на Python с FastAPI, Frontend – Next.js + TypeScript. База – PostgreSQL.

Можно не разворачивать локально, а просто воспользоваться бесплатно на сайте.
🔥221👍1🙏1
ByteDance снова в деле: новый ИИ-агент для программирования 👨‍💻

Китайцы из ByteDance выкатили в опенсорс Trae Agent — еще одного LLM-помощника для инженегров.

На бенчмарке SWE-bench Verified он показывает лучший результат среди опенсорс аналогов (75,2%).

Что под капотом?

🧠 Мульти-LLM: Жрет почти все — OpenAI, Anthropic, Azure, Doubao и OpenRouter. Можно подцепить хоть Claude 3.5 Sonnet, хоть GPT-4o, хоть Llama 3.1.

🛠 Не черный ящик: В отличие от многих, архитектура модульная. Можно ковыряться, расширять и смотреть, как он там думает. Идеально для экспериментов и кастомизации под себя.

⚙️ Удобный CLI и тулзы: Работает из консоли (trae-cli run "почини мой баг"), умеет в файлы, баш и даже в sequential_thinking для сложных задач. Все шаги логируются в trajectory-файлы для дебага.

По сути это исследовательская платформа и конструктор для создания своих агентов.


Выглядит любопытно. Особенно на фоне того, что многие подобные инструменты либо платные, либо представляют собой закрытую коробку.

Ссылка на GitHub: тык сюда
Please open Telegram to view this post
VIEW IN TELEGRAM
👍321🔥1🤔1🙏1