https://uproger.com/20-luchshih-maloizvestnyh-i-poleznyh-komand-linux/
@python_be1
https://uproger.com/20-luchshih-maloizvestnyh-i-poleznyh-komand-linux/
@python_be1
https://uproger.com/20-luchshih-maloizvestnyh-i-poleznyh-komand-linux/
UPROGER | Программирование
20 лучших малоизвестных и полезных команд Linux
В арсенале любого опытного Linux-администратора есть набор проверенных временем команд, которые используются ежедневно. ls, cd, grep, find, ps, top – без них немыслима эффективная работа. Однако за пределами этого стандартного набора скрывается множество…
Название первого курса от этого сотрудника: «Как попасть в IT.. Ну или не попасть.. Там как пойдёт, сильно губу не раскатывайте.. Да-да, нет-нет.. Может только айтишные мемы понимать начнете»
@python_be1
@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
🥚 3D Пасхальное яйцо от Google ,которое можно получить, вбив в поиск эту функцию:
1.2+(sqrt(1-(sqrt(x^2+y^2))^2) + 1 - x^2-y^2) * (sin (10 * (x*3+
Если найдете пасхулку кулича, скиньте в комменты 👇
@python_be1
1.2+(sqrt(1-(sqrt(x^2+y^2))^2) + 1 - x^2-y^2) * (sin (10 * (x*3+
Если найдете пасхулку кулича, скиньте в комменты 👇
@python_be1
⚡️ Огромный курс по созданию языковых моделей с ПОЛНОГО НУЛЯ выложил Стэнфорд — «СS336: Language Modeling from scratch» прямо сейчас преподают в университете и сразу же выкладывают на Ютуб для ВСЕХ.
• Кто угодно может БЕСПЛАТНО научиться создавать собственные ИИ-модели с нуля.
• Это огромный полноценный курс: от архитектуры и токенизаторов до обучения с подкреплением и масштабирования.
• Все темы преподы объясняют пошагово, от простого к сложному. Поймет даже новичок в кодинге.
• К каждой лекции есть множество дополнительных материалов и домашних заданий.
Сайт курса — здесь. (https://stanford-cs336.github.io/spring2025/) Плейлист на Ютубе — тут. (https://youtube.com/playlist?list=PLoROMvodv4rOY23Y0BoGoBGgQ1zmU_MT_)
👍
@python_be1
• Кто угодно может БЕСПЛАТНО научиться создавать собственные ИИ-модели с нуля.
• Это огромный полноценный курс: от архитектуры и токенизаторов до обучения с подкреплением и масштабирования.
• Все темы преподы объясняют пошагово, от простого к сложному. Поймет даже новичок в кодинге.
• К каждой лекции есть множество дополнительных материалов и домашних заданий.
Сайт курса — здесь. (https://stanford-cs336.github.io/spring2025/) Плейлист на Ютубе — тут. (https://youtube.com/playlist?list=PLoROMvodv4rOY23Y0BoGoBGgQ1zmU_MT_)
👍
@python_be1
суть программы вот в чем, 4 двигателя крутятся с одинаковым шагом но с разным промежутком времени, в результате программа работает с задержкой от того что должно быть по факту, если я увеличиваю скорость F1000 вместо F500 то программа работает быстрей, сами же двигатели не синхронно вращаются, в начале вроде как все как и должно быть, но под конец движения, какие-то двигателя вовремя заканчивают движения а какие-то только догоняют причем не зависимо от метода! время на паузы на трех двигателях 0.0157, а одном 0.0078 в секундах кстати на котором 0.0078 он и отстает
@python_be1
@python_be1
🗣 Dia — это новаяоткрытая модель текст‑в‑речь от Nari Labs с 1.6 млрд параметров, способная генерировать полноценный диалог с богатой экспрессией.
Ключевые возможности:
- Ультра‑реалистичный диалог. Генерация согласованных реплик двух «говорящих» персонажей, помеченных тэгами [S1] и [S2] в одном тексте.
- Эмоции и тон. Можно задавать тональность и интонацию через акустический запрос (audio prompt), а также управлять «невербалкой»: смех, кашель, вздохи и т. д.
- Voice cloning. Клонирование голоса по короткому образцу: подгрузите аудио и его транскрипт, и модель адаптируется под заданный тембр
GitHub
Модель написана на Python (100 % кода) с использованием PyTorch 2.0 и CUDA 12.6
Производительность и требования:
Полная версия требует ≈10 GB VRAM; в будущем планируется квантование модели.
Установка и запуск:
`pip install git+https://github.com/nari-labs/dia.git
git clone https://github.com/nari-labs/dia.git
cd dia
uv run app.py ` # или python app.py
В интерфейсе Gradio сразу можно оценить разницу с ElevenLabs и Sesame CSM‑1B
Лицензия: Apache 2.0.
Dia отлично подходит для ML‑исследований в TTS: вы получаете открытые весовые файлы, гибкий API для скриптов и UI для быстрой проверки гипотез.
На данный момент Dia поддерживает генерацию речи только на английском языке
▪Demo (https://yummy-fir-7a4.notion.site/dia)
▪Github (https://github.com/nari-labs/dia)
▪HF (https://huggingface.co/nari-labs/Dia-1.6B)
@python_be1
Ключевые возможности:
- Ультра‑реалистичный диалог. Генерация согласованных реплик двух «говорящих» персонажей, помеченных тэгами [S1] и [S2] в одном тексте.
- Эмоции и тон. Можно задавать тональность и интонацию через акустический запрос (audio prompt), а также управлять «невербалкой»: смех, кашель, вздохи и т. д.
- Voice cloning. Клонирование голоса по короткому образцу: подгрузите аудио и его транскрипт, и модель адаптируется под заданный тембр
GitHub
Модель написана на Python (100 % кода) с использованием PyTorch 2.0 и CUDA 12.6
Производительность и требования:
Полная версия требует ≈10 GB VRAM; в будущем планируется квантование модели.
Установка и запуск:
`pip install git+https://github.com/nari-labs/dia.git
git clone https://github.com/nari-labs/dia.git
cd dia
uv run app.py ` # или python app.py
В интерфейсе Gradio сразу можно оценить разницу с ElevenLabs и Sesame CSM‑1B
Лицензия: Apache 2.0.
Dia отлично подходит для ML‑исследований в TTS: вы получаете открытые весовые файлы, гибкий API для скриптов и UI для быстрой проверки гипотез.
На данный момент Dia поддерживает генерацию речи только на английском языке
▪Demo (https://yummy-fir-7a4.notion.site/dia)
▪Github (https://github.com/nari-labs/dia)
▪HF (https://huggingface.co/nari-labs/Dia-1.6B)
@python_be1
🖥 ex — это утилита для создания одного исполняемого файла .pex, внутри которого содержится вся ваша программа на Python и её зависимости. По сути это самодостаточная, переносимая среда выполнения, похожая на virtualenv, но упакованная в один файл.
Зачем это нужно?
Простота развёртывания: чтобы установить и запустить приложение, достаточно скопировать файл app.pex и запустить его — никакой дополнительной настройки.
Портируемость: один файл может включать сборки для разных платформ (Linux, macOS).
Изоляция зависимостей: все библиотеки (включая C‑расширения) уже внутри, конфликтов версий нет.
Как пользоваться:
Устанавливаем сам инструмент:
`pip install pex`
Собираем .pex-файл:
`pex requests -o fetch.pex —script=requests`
После этого fetch.pex — готовый исполняемый файл, который при запуске сразу импортирует и запускает библиотеку requests.
Интеграция с другими сборщиками:
Системы вроде `Pants, Buck и {py}gradle `умеют автоматически собирать .pex-архивы из вашего кода.
Лицензия: Apache 2.0
▪ GitHub: https://github.com/pex-tool/pex
▪Документация: https://docs.pex-tool.org/
@python_be1
Зачем это нужно?
Простота развёртывания: чтобы установить и запустить приложение, достаточно скопировать файл app.pex и запустить его — никакой дополнительной настройки.
Портируемость: один файл может включать сборки для разных платформ (Linux, macOS).
Изоляция зависимостей: все библиотеки (включая C‑расширения) уже внутри, конфликтов версий нет.
Как пользоваться:
Устанавливаем сам инструмент:
`pip install pex`
Собираем .pex-файл:
`pex requests -o fetch.pex —script=requests`
После этого fetch.pex — готовый исполняемый файл, который при запуске сразу импортирует и запускает библиотеку requests.
Интеграция с другими сборщиками:
Системы вроде `Pants, Buck и {py}gradle `умеют автоматически собирать .pex-архивы из вашего кода.
Лицензия: Apache 2.0
▪ GitHub: https://github.com/pex-tool/pex
▪Документация: https://docs.pex-tool.org/
@python_be1
🖥 Новинка в Python 3.14: t-строки — типобезопасные f-строки
Python 3.14 вводит t"..." — новый синтаксис для строк, ориентированных на безопасность типов и интеграцию с системами шаблонов, SQL, HTML и др.
🔹 Что такое t-строка?
t"..." — это как f"...", но:
- интерполяция ограничена и контролируема;
- поддерживается строгое соответствие шаблону;
- можно передавать переменные явно, предотвращая SQL-инъекции и XSS.
🔸 Пример:
```
name = "Alice"
greeting = t"Hello, {name}!" # t-строка
Вместо немедленной подстановки, как в f"...", t"..." создает шаблон с выражениями как параметрами.
```
🔐 Зачем это нужно?
✅ Безопасность при генерации SQL, HTML, JSON
✅ Улучшение инструментов и проверки типов (через static analysis)
✅ Контроль над контекстом исполнения (больше нельзя просто вставить переменную как есть — нужно передать её явно)
📦 Использование:
t-строки — это первый шаг к "template string literals" как в TypeScript.
Можно использовать с функциями:
```
def html(template: T[str]) -> SafeHTML:
...
html(t"<div>{user_input}</div>")
```
💡 Почему это важно?
Старый код:
```
f"SELECT * FROM users WHERE name = '{user_name}'"
может привести к SQL-инъекциям и XSS.
t-строки — безопасная альтернатива с встроенной защитой.
```
🛡 Пример: безопасный HTML
```
template = t"<p>{user_input}</p>"
html_output = html(template)
# <p><script>alert('bad')</script></p>
```
Функция html() может вернуть не просто строку, а полноценный HTMLElement.
Больше никакой "грязи" — всё чисто и типобезопасно.
🔍 Работа с шаблоном
t-строки позволяют получить доступ к содержимому:
```
template = t"Hello {name}!"
template.strings # ("Hello ", "!")
template.values # (name,)
template.interpolations[0].format_spec # ">8"
```
Можно и вручную собрать шаблон:
```
Template("Hello ", Interpolation(value="World", expression="name"), "!")
```
🚀 Вывод:
t"..." — шаг к безопасным шаблонам и типизации строк в Python.
Готовься к будущему Python — безопасному по умолчанию.
📌 Подробнее здесь (https://davepeck.org/2025/04/11/pythons-new-t-strings/)
@python_be1
Python 3.14 вводит t"..." — новый синтаксис для строк, ориентированных на безопасность типов и интеграцию с системами шаблонов, SQL, HTML и др.
🔹 Что такое t-строка?
t"..." — это как f"...", но:
- интерполяция ограничена и контролируема;
- поддерживается строгое соответствие шаблону;
- можно передавать переменные явно, предотвращая SQL-инъекции и XSS.
🔸 Пример:
```
name = "Alice"
greeting = t"Hello, {name}!" # t-строка
Вместо немедленной подстановки, как в f"...", t"..." создает шаблон с выражениями как параметрами.
```
🔐 Зачем это нужно?
✅ Безопасность при генерации SQL, HTML, JSON
✅ Улучшение инструментов и проверки типов (через static analysis)
✅ Контроль над контекстом исполнения (больше нельзя просто вставить переменную как есть — нужно передать её явно)
📦 Использование:
t-строки — это первый шаг к "template string literals" как в TypeScript.
Можно использовать с функциями:
```
def html(template: T[str]) -> SafeHTML:
...
html(t"<div>{user_input}</div>")
```
💡 Почему это важно?
Старый код:
```
f"SELECT * FROM users WHERE name = '{user_name}'"
может привести к SQL-инъекциям и XSS.
t-строки — безопасная альтернатива с встроенной защитой.
```
🛡 Пример: безопасный HTML
```
template = t"<p>{user_input}</p>"
html_output = html(template)
# <p><script>alert('bad')</script></p>
```
Функция html() может вернуть не просто строку, а полноценный HTMLElement.
Больше никакой "грязи" — всё чисто и типобезопасно.
🔍 Работа с шаблоном
t-строки позволяют получить доступ к содержимому:
```
template = t"Hello {name}!"
template.strings # ("Hello ", "!")
template.values # (name,)
template.interpolations[0].format_spec # ">8"
```
Можно и вручную собрать шаблон:
```
Template("Hello ", Interpolation(value="World", expression="name"), "!")
```
🚀 Вывод:
t"..." — шаг к безопасным шаблонам и типизации строк в Python.
Готовься к будущему Python — безопасному по умолчанию.
📌 Подробнее здесь (https://davepeck.org/2025/04/11/pythons-new-t-strings/)
@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
Появилась новая нейронка для генерации веб-приложений — Adaptive. Пользователи уже успели сделать с ней клона ChatGPT и других сайтов.
В Adaptive можно добавлять ИИ-функции, встроить прием платежей и систему регистрации пользователей. При этом API-ключ других нейронок для работы не нужен.
Пробуем здесь (https://adaptive.ai/). Бесплатно дают сделать десять приложений.
@python_be1
В Adaptive можно добавлять ИИ-функции, встроить прием платежей и систему регистрации пользователей. При этом API-ключ других нейронок для работы не нужен.
Пробуем здесь (https://adaptive.ai/). Бесплатно дают сделать десять приложений.
@python_be1
Media is too big
VIEW IN TELEGRAM
🐱Статьи, графики, таблицы — новый ИИ-агент Suna делает всё за вас
Вышел бесплатный ИИ-инструмент Suna, который превращает любую задачу в детальный и чёткий доклад с графиками, таблицами и выводами.
Что умеет:
— Сам планирует, ищет и обрабатывает инфу — вы даёте только тему;
— Управляет браузером, Excel и даже кодом;
— Сканирует сотни источников;
— Генерирует визуально оформленные отчёты — всё уже готово к презентации.
Подходит для студентов, аналитиков, маркетологов и просто ленивых. Бесплатно.
Запускаем на ПК через GitHub (https://github.com/Kortix-ai/Suna) или онлайн — здесь (https://www.suna.so/).
5️⃣
@python_be1
Вышел бесплатный ИИ-инструмент Suna, который превращает любую задачу в детальный и чёткий доклад с графиками, таблицами и выводами.
Что умеет:
— Сам планирует, ищет и обрабатывает инфу — вы даёте только тему;
— Управляет браузером, Excel и даже кодом;
— Сканирует сотни источников;
— Генерирует визуально оформленные отчёты — всё уже готово к презентации.
Подходит для студентов, аналитиков, маркетологов и просто ленивых. Бесплатно.
Запускаем на ПК через GitHub (https://github.com/Kortix-ai/Suna) или онлайн — здесь (https://www.suna.so/).
5️⃣
@python_be1
Ваш первый бэкенд на Django — пошаговый учебник
Бесплатный самоучитель по Django (https://tutorial.djangogirls.org/), созданный специально для новичков. Шаг за шагом вы создадите веб-приложение (блог) на Python с использованием фреймворка Django.
По ходу дела объясняются все необходимые основы — от базового Python до шаблонов HTML/CSS. К концу у вас будет собственный рабочий блог на сервере и понимание принципов бэкенд-разработки.
#бэкенд #python #django
@python_be1
Бесплатный самоучитель по Django (https://tutorial.djangogirls.org/), созданный специально для новичков. Шаг за шагом вы создадите веб-приложение (блог) на Python с использованием фреймворка Django.
По ходу дела объясняются все необходимые основы — от базового Python до шаблонов HTML/CSS. К концу у вас будет собственный рабочий блог на сервере и понимание принципов бэкенд-разработки.
#бэкенд #python #django
@python_be1
🖥 PDF Craft — библиотека на Python для конвертации PDF (в первую очередь сканированных книг) в Markdown и EPUB с использованием локальных AI-моделей и LLM для структурирования содержимого
GitHub
🌟 Основные возможности
- Извлечение текста и макета
Использует сочетание DocLayout-YOLO и собственных алгоритмов для детектирования и фильтрации заголовков, колонтитулов, сносок и номеров страниц
- Локальный OCR
Распознаёт текст на странице через OnnxOCR, поддерживает ускорение на GPU (CUDA)
- Определение порядка чтения
С помощью layoutreader строит поток текста в том порядке, в котором его воспринимает человек
- Конвертация в Markdown
Генерирует .md с относительными ссылками на изображения (иллюстрации, таблицы, формулы) в папке assets
- Конвертация в EPUB
На основе промежуточных результатов OCR передаёт данные в LLM (рекомендуется DeepSeek) для построения оглавления, глав, корректировки ошибок и включения аннотаций
Установка и требования
Python ≥ 3.10 (рекомендуется 3.10.16).
`pip install pdf-craft и pip install onnxruntime==1.21.0 (или onnxruntime-gpu==1.21.0 для CUDA).`
Для EPUB-конвейера нужен доступ к LLM-сервису (например, DeepSeek).
🟡 Github (https://github.com/oomol-lab/pdf-craft)
@python_be1
GitHub
🌟 Основные возможности
- Извлечение текста и макета
Использует сочетание DocLayout-YOLO и собственных алгоритмов для детектирования и фильтрации заголовков, колонтитулов, сносок и номеров страниц
- Локальный OCR
Распознаёт текст на странице через OnnxOCR, поддерживает ускорение на GPU (CUDA)
- Определение порядка чтения
С помощью layoutreader строит поток текста в том порядке, в котором его воспринимает человек
- Конвертация в Markdown
Генерирует .md с относительными ссылками на изображения (иллюстрации, таблицы, формулы) в папке assets
- Конвертация в EPUB
На основе промежуточных результатов OCR передаёт данные в LLM (рекомендуется DeepSeek) для построения оглавления, глав, корректировки ошибок и включения аннотаций
Установка и требования
Python ≥ 3.10 (рекомендуется 3.10.16).
`pip install pdf-craft и pip install onnxruntime==1.21.0 (или onnxruntime-gpu==1.21.0 для CUDA).`
Для EPUB-конвейера нужен доступ к LLM-сервису (например, DeepSeek).
🟡 Github (https://github.com/oomol-lab/pdf-craft)
@python_be1
Товарищи! А есть библиотека для экспериментов, имитации процессов (химия, физика, оптика)? Везде только библиотеки для создания игр, это не совсем то что нужно...
@python_be1
@python_be1
1️⃣0️⃣0️⃣0️⃣ гайдов для разрабов в одном репозитории — разраб из Твиттера собирал огромный сундук знаний целых 10 лет.
В нем есть буквально ВСЁ: от шпаргалок по горячим клавишам для ускорения работы до фундаментальных гайдов по языкам программирования для веба, разработки ПО и курсов по устройству сетей, безопасности и многому другому.
• Инструменты для работы с CLI и GUI, вебом и локальными сетями.
• Список всех актуальных фреймворков и библиотек в 2025 году.
• Гайды по тестированию и хакингу приложений.
• Шпаргалки по взаимодействию с командной строкой.
• ТОННА блогов, Ютуб-каналов, колонок в онлайн-СМИ и журналах, чтобы поддерживать свежесть знаний и не отставать от прогресса.
Фолиант мудреца читаем — здесь. (https://github.com/trimstray/the-book-of-secret-knowledge?tab=readme-ov-file#manualshowtostutorials-toc)
👍
@python_be1
В нем есть буквально ВСЁ: от шпаргалок по горячим клавишам для ускорения работы до фундаментальных гайдов по языкам программирования для веба, разработки ПО и курсов по устройству сетей, безопасности и многому другому.
• Инструменты для работы с CLI и GUI, вебом и локальными сетями.
• Список всех актуальных фреймворков и библиотек в 2025 году.
• Гайды по тестированию и хакингу приложений.
• Шпаргалки по взаимодействию с командной строкой.
• ТОННА блогов, Ютуб-каналов, колонок в онлайн-СМИ и журналах, чтобы поддерживать свежесть знаний и не отставать от прогресса.
Фолиант мудреца читаем — здесь. (https://github.com/trimstray/the-book-of-secret-knowledge?tab=readme-ov-file#manualshowtostutorials-toc)
👍
@python_be1
Что такое collections.Counter?
collections.Counter — это специальный класс, предоставляющий удобный способ подсчета хэшируемых объектов. Он является подклассом словаря и предоставляет функциональность для подсчета количества вхождений каждого элемента в последовательность (список, кортеж, строку и т.д.).
@python_be1
collections.Counter — это специальный класс, предоставляющий удобный способ подсчета хэшируемых объектов. Он является подклассом словаря и предоставляет функциональность для подсчета количества вхождений каждого элемента в последовательность (список, кортеж, строку и т.д.).
@python_be1
🖥Задача: "Динамическое кэширование с ограничением памяти и частотой запросов"
🔖 Условие:
Реализуйте класс `SmartCache`, который работает следующим образом:
- Метод `put(key: str, value: Any)`:
- Сохраняет значение по ключу.
- Если суммарный объем памяти, занимаемый всеми элементами, превышает лимит (например, 10 MB), автоматически удаляются наименее "ценные" элементы.
- Метод `get(key: str) -> Any`:
- Возвращает значение по ключу.
- Увеличивает счётчик использования элемента.
- Если элемент отсутствует — возвращает `None`.
Что значит "ценность" элемента:
- Ценность = количество обращений (`hit count`) к элементу.
- При очистке кэша сначала удаляются элементы с наименьшим количеством обращений.
Ограничения:
- Класс должен корректно считать объём памяти, занимаемый элементами.
- Нужно учитывать, что элементы могут быть сложными структурами (`dict`, `list`, вложенные объекты).
- Решение должно быть эффективным: операции должны быть быстрыми даже при большом количестве элементов.
---
▪️ Подсказки:
- Для оценки размера объектов можно использовать модуль `sys.getsizeof`, но для сложных вложенных структур нужен рекурсивный подсчет.
- Для хранения частоты обращений стоит использовать дополнительную структуру данных (`collections.Counter` или `dict`).
- При очистке лучше сначала группировать элементы по "ценности", а затем удалять самые "дешевые".
---
▪️ Что оценивается:
- Умение работать с ограничениями по памяти.
- Аккуратная обработка ссылок и размеров объектов.
- Эффективность очистки кэша.
- Чистота и читаемость кода.
---
▪️ Разбор возможного решения:
Идея архитектуры:
- Храним:
- `storage`: словарь `{key: value}`.
- `hits`: счётчик `{key: hit_count}`.
- `size`: общий размер всех объектов.
- При `put()`:
- Добавляем элемент.
- Пересчитываем суммарный размер.
- Если размер превышает лимит:
- Удаляем наименее популярные элементы до тех пор, пока не уложимся в лимит.
- При `get()`:
- Увеличиваем `hit_count` элемента.
- Возвращаем значение или `None`.
Оценка размера объектов:
- Простого `sys.getsizeof` недостаточно для коллекций.
- Нужна функция, рекурсивно подсчитывающая размер всех вложенных объектов.
Мини-пример функции подсчета размера:
```
import sys
def deep_getsizeof(obj, seen=None):
"""Рекурсивно считает память объекта и его вложенных объектов"""
size = sys.getsizeof(obj)
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
return 0
seen.add(obj_id)
if isinstance(obj, dict):
size += sum([deep_getsizeof(v, seen) + deep_getsizeof(k, seen) for k, v in obj.items()])
elif isinstance(obj, (list, tuple, set, frozenset)):
size += sum(deep_getsizeof(i, seen) for i in obj)
return size
```
Мини-пример интерфейса `SmartCache`:
```
class SmartCache:
def __init__(self, max_size_bytes):
self.max_size = max_size_bytes
self.storage = {}
self.hits = {}
self.total_size = 0
def put(self, key, value):
# добавить логику добавления и очистки при переполнении
pass
def get(self, key):
# увеличить hit_count и вернуть значение
pass
```
---
▪️ Дополнительные вопросы:
- Как ускорить очистку кэша без полного перебора всех элементов?
- Как сделать потокобезопасную версию кэша?
- Как адаптировать `SmartCache` для распределённой архитектуры (кэш между несколькими машинами)?
---
@python_be1
🔖 Условие:
Реализуйте класс `SmartCache`, который работает следующим образом:
- Метод `put(key: str, value: Any)`:
- Сохраняет значение по ключу.
- Если суммарный объем памяти, занимаемый всеми элементами, превышает лимит (например, 10 MB), автоматически удаляются наименее "ценные" элементы.
- Метод `get(key: str) -> Any`:
- Возвращает значение по ключу.
- Увеличивает счётчик использования элемента.
- Если элемент отсутствует — возвращает `None`.
Что значит "ценность" элемента:
- Ценность = количество обращений (`hit count`) к элементу.
- При очистке кэша сначала удаляются элементы с наименьшим количеством обращений.
Ограничения:
- Класс должен корректно считать объём памяти, занимаемый элементами.
- Нужно учитывать, что элементы могут быть сложными структурами (`dict`, `list`, вложенные объекты).
- Решение должно быть эффективным: операции должны быть быстрыми даже при большом количестве элементов.
---
▪️ Подсказки:
- Для оценки размера объектов можно использовать модуль `sys.getsizeof`, но для сложных вложенных структур нужен рекурсивный подсчет.
- Для хранения частоты обращений стоит использовать дополнительную структуру данных (`collections.Counter` или `dict`).
- При очистке лучше сначала группировать элементы по "ценности", а затем удалять самые "дешевые".
---
▪️ Что оценивается:
- Умение работать с ограничениями по памяти.
- Аккуратная обработка ссылок и размеров объектов.
- Эффективность очистки кэша.
- Чистота и читаемость кода.
---
▪️ Разбор возможного решения:
Идея архитектуры:
- Храним:
- `storage`: словарь `{key: value}`.
- `hits`: счётчик `{key: hit_count}`.
- `size`: общий размер всех объектов.
- При `put()`:
- Добавляем элемент.
- Пересчитываем суммарный размер.
- Если размер превышает лимит:
- Удаляем наименее популярные элементы до тех пор, пока не уложимся в лимит.
- При `get()`:
- Увеличиваем `hit_count` элемента.
- Возвращаем значение или `None`.
Оценка размера объектов:
- Простого `sys.getsizeof` недостаточно для коллекций.
- Нужна функция, рекурсивно подсчитывающая размер всех вложенных объектов.
Мини-пример функции подсчета размера:
```
import sys
def deep_getsizeof(obj, seen=None):
"""Рекурсивно считает память объекта и его вложенных объектов"""
size = sys.getsizeof(obj)
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
return 0
seen.add(obj_id)
if isinstance(obj, dict):
size += sum([deep_getsizeof(v, seen) + deep_getsizeof(k, seen) for k, v in obj.items()])
elif isinstance(obj, (list, tuple, set, frozenset)):
size += sum(deep_getsizeof(i, seen) for i in obj)
return size
```
Мини-пример интерфейса `SmartCache`:
```
class SmartCache:
def __init__(self, max_size_bytes):
self.max_size = max_size_bytes
self.storage = {}
self.hits = {}
self.total_size = 0
def put(self, key, value):
# добавить логику добавления и очистки при переполнении
pass
def get(self, key):
# увеличить hit_count и вернуть значение
pass
```
---
▪️ Дополнительные вопросы:
- Как ускорить очистку кэша без полного перебора всех элементов?
- Как сделать потокобезопасную версию кэша?
- Как адаптировать `SmartCache` для распределённой архитектуры (кэш между несколькими машинами)?
---
@python_be1