Python Community
11.9K subscribers
1.4K photos
115 videos
15 files
921 links
Python Community RU - СНГ сообщество Python-разработчиков

Чат канала: @python_community_chat

Сотрудничество: @cyberJohnny и @Sergey_bzd

РКН реестр:
https://knd.gov.ru/license?id=67847dd98e552d6b54a511ed&registryType=bloggersPermission
Download Telegram
✔️ Claude Code превращают в баг-хантинг машину

Claude-BugHunter - skill bundle для Claude Code, который добавляет готовую методологию для легального bug bounty, security audit и authorized red-team задач.

Это не один промпт в стиле «найди баги». Внутри целый набор рабочих навыков и команд:

- 51 skill и 15 slash-команд
- 574+ паттерна из раскрытых security-репортов
- 24 класса уязвимостей
- workflow для поиска, валидации, триажа и оформления findings
- шаблоны под enterprise-цепочки для M365, Okta, VMware и VPN-appliances
- scaffold папок под engagement: scope, notes, evidence, findings, reports
- интеграция с Burp через MCP

Проект: https://github.com/elementalsouls/Claude-BugHunter

@Python_Community_ru
🖥 Python умеет аккуратно читать вывод долгого процесса по мере выполнения

Вместо того чтобы ждать завершения команды, можно запустить её через subprocess.Popen и читать stdout построчно.

Так удобно следить за:

- долгими скриптами
- серверами
- сборками
- тестами
- CLI-утилитами
- фоновой обработкой данных

Пример на картинке запускает HTTP-сервер и сразу печатает его вывод:

subprocess.Popen(...) стартует процесс
stdout=subprocess.PIPE забирает поток вывода
iter(proc.stdout.readline, b'') читает строки, пока процесс жив

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

@Python_Community_ru
O(1) не значит «быстро»

Одна из самых частых ошибок в алгоритмах: считать, что O(1) всегда быстрее O(n).

На практике это не так.

O(1) означает только одно: время работы не растёт вместе с размером входных данных.

Но сама операция может быть дорогой.

Например, хеш-таблица формально даёт O(1) для поиска, но если данные не в кэше CPU, один cache miss может сделать её медленнее, чем простой линейный проход по маленькому массиву.

Именно поэтому в Go, Python и даже C-библиотеках для маленьких map/таблиц иногда используют обычный linear search.

Парадоксально, но:

O(n) при n = 16 и тёплом кэше может быть быстрее, чем O(1) с холодным cache miss.

Big O описывает асимптотический рост, а не реальную скорость на маленьких данных.

@Python_Community_ru
⚡️ Как Redis считает миллиарды уникальных значений, почти не тратя память

Есть алгоритм HyperLogLog. Он позволяет примерно понять, сколько уникальных элементов прошло через систему, используя около 12 KB памяти.

Идея простая: Redis не хранит сами элементы.

Он делает так:

- берёт элемент
- считает от него хеш
- часть хеша использует как номер ячейки
- в другой части смотрит, сколько нулей подряд встретилось
- если новое число больше старого - обновляет ячейку

Почему это работает?

Потому что длинная серия нулей в хеше встречается редко.

Например:

- 1 ноль подряд - довольно часто
- 5 нулей подряд - уже реже
- 10 нулей подряд - примерно шанс 1 к 1024
- 20 нулей подряд - совсем редкое событие

Если Redis увидел очень редкий паттерн, значит через него, скорее всего, прошло много разных элементов.

В Redis используется 16 384 маленьких счётчика. Каждый хранит максимальную «редкость», которую видел для своей группы элементов.

Потом Redis объединяет эти значения математикой и получает оценку уникальных элементов.

Не точное число, а очень близкую оценку.

Главный прикол HyperLogLog:

он может обработать хоть миллионы, хоть миллиарды значений, но память почти не растёт.

Именно поэтому Redis умеет считать уникальных пользователей, IP, запросы или события без огромных таблиц и списков.

@Python_Community_ru
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Python умеет читать бинарные файлы блоками очень элегантно - без ручного while True.

Вот такой приём через functools.partial:


`iter(partial(f.read, 64), b'')`


Что тут происходит:

partial(f.read, 64) превращает f.read(64) в функцию без аргументов.

iter(..., b'') вызывает её снова и снова, пока результат не станет b'', то есть пока файл не закончится.

В итоге получаем аккуратный цикл по блокам:


from functools import partial

with open("mydata.db", "rb") as f:
for block in iter(partial(f.read, 64), b""):
process_block(block)

@Python_Community_ru
👍2
🖥 В России второй день подряд жалуются на проблемы с доступом к PyPI, главному репозиторию пакетов для Python. По данным Downdetector, сбои затрагивают пользователей из разных регионов.

PyPI для Python-разработчиков - это не просто сайт с библиотеками. Через него ставятся зависимости, фреймворки, CLI-утилиты и большая часть всего, что нужно для нормальной разработки. Когда он начинает отваливаться, ломается не «ещё один зарубежный сервис», а базовая инфраструктура языка.

Диагностика интернет-блокировок показала обрыв соединения на этапе TLS. Это момент, когда клиент и сервер пытаются установить защищённое соединение. Такое поведение похоже на блокировки через DPI, то есть глубокую инспекцию пакетов.

По симптомам ситуация напоминает недавние проблемы с доступом к DeepSeek, которые издание тоже связывало с похожим механизмом.

При этом в Роскомнадзоре утверждают, что PyPI не ограничивали и проблем с доступом к ресурсу не фиксируют, сообщает «Осторожно, новости».

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

@Python_Community_ru
🔥1🤔1
🖥 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 хорош не как самый быстрый исполнитель каждой операции.

Он хорош как удобный слой управления над быстрыми нативными кусками.

@Python_Community_ru
✔️ Centaur - это платформа для совместного использования AI-агентов, интегрированных в Slack.

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

🚀 Основные моменты:
- Slack-агенты для выполнения задач и получения ответов.
- Изолированные среды для безопасного выполнения команд.
- Поддержка пользовательских инструментов и плагинов.
- Долговременные рабочие процессы с возможностью восстановления.
- Хранение состояния для повторного подключения без потери данных.

📌 GitHub: https://github.com/paradigmxyz/centaur

#python

@Python_Community_ru
🚀 GPU-библиотека для классического машинного обучения

FlashLib предлагает высокопроизводительные реализации операторов машинного обучения, таких как kmeans, PCA и DBSCAN, с использованием Triton и CuteDSL. Библиотека позволяет эффективно обрабатывать данные на GPU, обеспечивая простоту использования и высокую скорость выполнения.

🚀Основные моменты:
- Поддержка 15 высокоуровневых примитивов для машинного обучения.
- Информативный API для оценки производительности операций.
- Оптимизированные реализации для кластеризации, регрессии и декомпозиции.
- Легкая интеграция с PyTorch и sklearn.

📌 GitHub: https://github.com/FlashML-org/flashlib

#python

@Python_Community_ru
Nex-N2 - новое любопытное семейство агентных моделей.

Что внутри:

- Adaptive Thinking - модель сама подбирает глубину рассуждения на каждом шаге
- экономия около 20% токенов без потери качества
- Coherent Thinking - единый формат мышления для поиска, кодинга и tool use
- меньше хрупких переключений между разными режимами работы

По заявлению команды, Nex-N2 показывает уровень Tier-1 open-source моделей на SWE-bench, Terminal-Bench, GDPval и других бенчмарках, приближаясь к GPT-5.5 и Opus 4.7.

Звучит мощно, но такие цифры стоит проверять независимыми прогонами.

- Kimi-K2.6: 86% - 13 из 14
- MiniMax: 100% - 8 из 8
- GLM-5.1: 100% - 13 из 13
- DeepSeek-V4-Pro: 92% - 11 из 12
- Opus 4.7: 45% - 5 из 11
- GPT-5.5: 30% - 3 из 10

🔗 https://nex-agi.com
📦 https://huggingface.co/nex-agi/Nex-N2-Pro
https://modelscope.cn/models/nex-agi/Nex-N2-Pro
https://github.com/nex-agi/Nex-N2

@Python_Community_ru