Бенчмарк 8 Python-библиотек для извлечения текста из документов
Авторы Kreuzberg выложили обновлённое сравнение 8 open source инструментов для text extraction: Kreuzberg, Apache Tika, Docling, Unstructured, PDFPlumber, Pandoc, PyMuPDF4LLM, MarkItDown, Mineru. 56 типов файлов, p50/p95/p99 по скорости и памяти, quality score против ground truth.
Методика: бенчмарк-харнес на Rust, запускается в GitHub Actions CI. Замеряют extraction duration, throughput, memory, success rate. Качество измеряют через сравнение извлечённого текста с эталоном.
И что бы вы думали, кто победил? Конечно же сам Kreuzberg. Он покрывает больше всего форматов (49/56), success rate 99,1%. Docling и Unstructured надёжны, но в разы медленнее. Docling на сложных файлах может считать 60+ минут на файл.
Но бенчмарк открытый и воспроизводимый, так что в целом как будто Kreuzberg реально можно пробовать.
@zen_of_python
Авторы Kreuzberg выложили обновлённое сравнение 8 open source инструментов для text extraction: Kreuzberg, Apache Tika, Docling, Unstructured, PDFPlumber, Pandoc, PyMuPDF4LLM, MarkItDown, Mineru. 56 типов файлов, p50/p95/p99 по скорости и памяти, quality score против ground truth.
Методика: бенчмарк-харнес на Rust, запускается в GitHub Actions CI. Замеряют extraction duration, throughput, memory, success rate. Качество измеряют через сравнение извлечённого текста с эталоном.
И что бы вы думали, кто победил? Конечно же сам Kreuzberg. Он покрывает больше всего форматов (49/56), success rate 99,1%. Docling и Unstructured надёжны, но в разы медленнее. Docling на сложных файлах может считать 60+ минут на файл.
Но бенчмарк открытый и воспроизводимый, так что в целом как будто Kreuzberg реально можно пробовать.
@zen_of_python
👍3❤1
25 лет на ORM, теперь — raw queries + dataclasses. И вот почему
Майкл Кеннеди (автор Talk Python to Me) отказался от ORM/ODM в пользу паттерна Raw+DC: сырые запросы к базе + Python dataclasses на границе слоя доступа к данным.
🔘Главный аргумент: ИИ-ассистенты пишут нативные запросы в разы лучше, чем ORM-код. У PyMongo в 53 раза больше загрузок, чем у Beanie, и нативный синтаксис MongoDB одинаковый в Node, PHP, Go. Разница в обучающих данных огромна.
🔘Паттерн простой: raw query → dict → from_doc() → dataclass. Type safety, автокомплит в IDE, поддержка mypy — всё на месте. Без магии ORM, без зависимости от фреймворка.
🔘В комментах согласны с ИИ-аргументом, но напоминают: ORM — это не только запросы, но и миграции, валидация, защита от SQL-инъекций. Raw SQL повышает порог ответственности за безопасность.
📎 Тред на r/Python
А вы как обычно кодите?
@zen_of_python, теперь и в Max
Майкл Кеннеди (автор Talk Python to Me) отказался от ORM/ODM в пользу паттерна Raw+DC: сырые запросы к базе + Python dataclasses на границе слоя доступа к данным.
🔘Главный аргумент: ИИ-ассистенты пишут нативные запросы в разы лучше, чем ORM-код. У PyMongo в 53 раза больше загрузок, чем у Beanie, и нативный синтаксис MongoDB одинаковый в Node, PHP, Go. Разница в обучающих данных огромна.
🔘Паттерн простой: raw query → dict → from_doc() → dataclass. Type safety, автокомплит в IDE, поддержка mypy — всё на месте. Без магии ORM, без зависимости от фреймворка.
🔘В комментах согласны с ИИ-аргументом, но напоминают: ORM — это не только запросы, но и миграции, валидация, защита от SQL-инъекций. Raw SQL повышает порог ответственности за безопасность.
📎 Тред на r/Python
А вы как обычно кодите?
@zen_of_python, теперь и в Max
❤10🌚1
Вот ещё новость прошедшей недели: PyTorch перевёл тайпчекинг основного репозитория с MyPy на Pyrefly. Проверка всего проекта: MyPy — 50,6 сек, Pyrefly — 5,5 сек.
Вроде здорово, молодцы, но ведь есть ty. Ещё и пост в блоге написали, как будто одна известная большая корпорация повлияла.
А вы чем в 2026 тайп-чекаете?
(Да, как вы поняли, очень хочется пообщаться с вами, дайте каких-то комментариев, пожалуйста.)
Вроде здорово, молодцы, но ведь есть ty. Ещё и пост в блоге написали, как будто одна известная большая корпорация повлияла.
А вы чем в 2026 тайп-чекаете?
(Да, как вы поняли, очень хочется пообщаться с вами, дайте каких-то комментариев, пожалуйста.)
❤4
Анализ датасета QUT-DV25 (14 000 семплов малвари из PyPI) показал, что больше половины пакетов запускают reverse shell или крадут env-переменные прямо в
Проблема: sdist-пакеты требуют выполнения
Есть такой инструмент KEIP — eBPF-тул на LSM-хуках, который ставит сетевой whitelist на время
Вообще, в 2026
@zen_of_python
setup.py т.е. достаточно pip install, даже без импорта.
Проблема: sdist-пакеты требуют выполнения
setup.py при сборке. Это обычный Python-скрипт, он может делать что угодно — от сборки C-расширения до отправки ~/.ssh/id_rsa на C2-сервер.Есть такой инструмент KEIP — eBPF-тул на LSM-хуках, который ставит сетевой whitelist на время
pip install. Если setup.py или дочерний процесс лезет на сервер не из белого списка — весь процесс убиваетсяВообще, в 2026
setup.py — это красный флаг. Если пакет без pyproject.toml и без wheel, то может он и не нужен вам?@zen_of_python
This media is not supported in your browser
VIEW IN TELEGRAM
✍4❤3
МФТИ запускает онлайн-школу «Предпринимательское планирование»
Преподаватели с кафедры Технологического предпринимательства, а окончание школы даёт поступление в магистратуру на эту кафедру без экзаменов.
В школе основы и работа мини-группах: разработка бизнес-модели, фокус на рынке, стратегия роста. А в магистратуре приоритет на запуске бизнеса, в том числе работа с реальными успешными предпринимателями.
@zen_of_python, также в Max
Преподаватели с кафедры Технологического предпринимательства, а окончание школы даёт поступление в магистратуру на эту кафедру без экзаменов.
В школе основы и работа мини-группах: разработка бизнес-модели, фокус на рынке, стратегия роста. А в магистратуре приоритет на запуске бизнеса, в том числе работа с реальными успешными предпринимателями.
@zen_of_python, также в Max
❤2🤣2👍1
Как вам формат TOON (Token-Oriented Object Notation) вместо JSON?
Массивы объектов объявляются один раз в заголовке
Для Python уже есть готовые библиотеки, например
С другой стороны это просто CSV с дополнением, вложенности не очень удобно делать. Что думаете?
@zen_of_python, также в Max
Массивы объектов объявляются один раз в заголовке
users[2]{id,name,role}:, а дальше идут только данные через запятую без лишних скобок и ключей. Это сокращает объём данных на 30–60%.Для Python уже есть готовые библиотеки, например
python-toon и toons. Для промтов в ИИ экономия токенов. Для людей на глаз вроде тоже проще читается. С другой стороны это просто CSV с дополнением, вложенности не очень удобно делать. Что думаете?
@zen_of_python, также в Max
👍9❤3👎3
Вышел Starlette 1.0.0rc1, первый релиз-кандидат после 8 лет разработки
Напомню, Starlette — легковесный ASGI-фреймворк для Python. Поддерживает WebSocket, HTTP/2, фоновые задачи, middleware и маршрутизацию. На нём построен FastAPI, Starlette отвечает за всю сетевую часть, а FastAPI добавляет сверху валидацию через Pydantic и автогенерацию OpenAPI-схемы.
Том Кристи создал Starlette в июне 2018, а сейчас Марсело Трилесинский (Kludex) выпустил первый RC версии 1.0. Почти 10 млн скачиваний в день, а с недавних пор ещё и зависимость Python MCP SDK.
Что в релизе. Удаление deprecated-фич, помеченных для удаления в 1.0.0, плюс финальные баг-фиксы. Никаких крупных новых API, акцент на стабильности.
Реакция сообщества. «Starlette работала настолько стабильно, что казалось, будто 1.0 уже давно вышла». Несколько человек отметили, что узнали о Starlette как о зависимости, только когда начали копаться в MCP-серверах.
Установка:
@zen_of_python, также в Max
Напомню, Starlette — легковесный ASGI-фреймворк для Python. Поддерживает WebSocket, HTTP/2, фоновые задачи, middleware и маршрутизацию. На нём построен FastAPI, Starlette отвечает за всю сетевую часть, а FastAPI добавляет сверху валидацию через Pydantic и автогенерацию OpenAPI-схемы.
Том Кристи создал Starlette в июне 2018, а сейчас Марсело Трилесинский (Kludex) выпустил первый RC версии 1.0. Почти 10 млн скачиваний в день, а с недавних пор ещё и зависимость Python MCP SDK.
Что в релизе. Удаление deprecated-фич, помеченных для удаления в 1.0.0, плюс финальные баг-фиксы. Никаких крупных новых API, акцент на стабильности.
Реакция сообщества. «Starlette работала настолько стабильно, что казалось, будто 1.0 уже давно вышла». Несколько человек отметили, что узнали о Starlette как о зависимости, только когда начали копаться в MCP-серверах.
Установка:
pip install starlette==1.0.0rc1@zen_of_python, также в Max
🔥8🎉5
PEP 747 принят. В
Раньше функции вроде
Теперь можно так:
В Python приедет с версии 3.15. Уже сейчас доступно через
@zen_of_python
Telegram | Max
typing добавится TypeForm[T] — способ аннотировать аргументы, которые принимают не значения, а сами типы: int | str, list[int], TypedDict и другие.Раньше функции вроде
trycast() или is_match() из библиотек beartype, pydantic, typeguard приходилось аннотировать через object, слишком широко, без проверки типов.Теперь можно так:
def trycast[T](typx: TypeForm[T], value: object) -> T | None: ...
def is_match[T](value: object, typx: TypeForm[T]) -> TypeGuard[T]: ...
# Или просто переменная:
int_form: TypeForm = int | None
В Python приедет с версии 3.15. Уже сейчас доступно через
typing_extensions. Экспериментальная поддержка есть в Pyright@zen_of_python
Telegram | Max
👍9❤1
Внезапное порно в Conda
История такая: один разработчик хотел посмотреть YouTube, открыл меню «Пуск» в винде, начал вбивать You и увидел подсказу YouPorn. Очень удивился, потому что он не смотрит порно (конечно, а как вы подумали).
Начал расследование. Оказалось, что файл с таким именем лежит в
Protego — Python-библиотека для парсинга файлов robots.txt. В её тестовых данных есть пример файла robots.txt с сайта YouPorn т.е. обычный тест на реальных данных из интернета. Никакого вредоносного кода, никакой атаки на supply chain, просто Windows Search проиндексировал содержимое тестовых файлов внутри пакетов Conda.
Это хороший повод напомнить: Windows Search индексирует всё подряд, включая содержимое директорий с пакетами. При разработке на винде лучше добавить такие диры в исключения. Или не разрабатывать на винде.
@zen_of_python
История такая: один разработчик хотел посмотреть YouTube, открыл меню «Пуск» в винде, начал вбивать You и увидел подсказу YouPorn. Очень удивился, потому что он не смотрит порно (конечно, а как вы подумали).
Начал расследование. Оказалось, что файл с таким именем лежит в
Anaconda3\pkgs\protego\info\test\tests\test_data
Protego — Python-библиотека для парсинга файлов robots.txt. В её тестовых данных есть пример файла robots.txt с сайта YouPorn т.е. обычный тест на реальных данных из интернета. Никакого вредоносного кода, никакой атаки на supply chain, просто Windows Search проиндексировал содержимое тестовых файлов внутри пакетов Conda.
Это хороший повод напомнить: Windows Search индексирует всё подряд, включая содержимое директорий с пакетами. При разработке на винде лучше добавить такие диры в исключения. Или не разрабатывать на винде.
@zen_of_python
🌚12😁7✍2❤2
Опубликован черновик PEP 827 (Type Manipulation). Он предлагает добавить в Python возможности из TypeScript, чтобы не дублировать код при описании моделей.
Допустим, у вас есть класс
Сейчас приходится вручную писать новый класс и дублировать поля.
С PEP 827 можно будет сгенерировать его одной строкой:
—
—
— Если тип
Вместо копипасты под каждый эндпоинт (Create, Update, Read) вы описываете одну модель и генерируете производные. И всё это работает на уровне статического анализа. Черновик нацелен на Python 3.15.
@zen_of_python (теперь и в Max)
Допустим, у вас есть класс
User для базы данных, где есть id, email, username и created_at. Вам нужен класс UserUpdate для API, где id и created_at менять нельзя, а остальные поля необязательны, можно обновить только email.Сейчас приходится вручную писать новый класс и дублировать поля.
С PEP 827 можно будет сгенерировать его одной строкой:
UserUpdate = Partial[Omit[User, "id" | "created_at"]]
—
Omit убирает лишние поля из базового класса—
Partial делает оставшиеся необязательными— Если тип
email изменится в главной модели, он автоматически обновится и в UserUpdateВместо копипасты под каждый эндпоинт (Create, Update, Read) вы описываете одну модель и генерируете производные. И всё это работает на уровне статического анализа. Черновик нацелен на Python 3.15.
@zen_of_python (теперь и в Max)
🔥7👎4