Python_BE1
9 subscribers
748 photos
252 videos
7 files
672 links
Канал по Python, полезный и интересный контент для всех уровней.
По вопросам сотрудничества @cyberJohnny
Download Telegram
Что такое collections.Counter?

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
🖥 Задача: "Кэширование и ленивые вычисления в многопоточном окружении"

🔜 Условие:

Вам нужно реализовать декоратор `@thread_safe_cached`, который:

- Кэширует результат вызова функции по её аргументам (аналог `functools.lru_cache`, но свой).
- Если несколько потоков одновременно вызывают функцию с одинаковыми аргументами:
- Только один поток реально выполняет функцию,
- Остальные ждут, пока результат будет вычислен, и получают готовый результат.
- Кэш никогда не удаляется (неограниченный размер).

Ограничения:

- Решение должно работать для произвольных функций и аргументов (hashable).
- Нельзя использовать готовый `functools.lru_cache` или другие библиотеки кэширования.
- Нужно обеспечить корректную работу в многопоточной среде без гонок данных.

---

▪️ Подсказки:

- Для кэширования подойдёт `dict` с ключами по аргументам (`*args`, `**kwargs`).
- Для защиты доступа к кэшу понадобится `threading.Lock`.
- Для ожидания завершения вычисления другими потоками можно использовать `threading.Event`.
- Продумайте carefully: как отличить "результат уже посчитан" от "результат в процессе вычисления".

---

▪️ Что оценивается:

- Умение работать с многопоточностью в Python.
- Правильная организация кэширования.
- Чистота и лаконичность кода.
- Умение обрабатывать тонкие случаи, например: одновременные вызовы.

---

▪️ Разбор возможного решения:

Основная идея:

- Создать кэш `cache: Dict[Key, Result]`.
- Одновременно создать словарь "ожиданий" `in_progress: Dict[Key, threading.Event]`.
- Если кто-то начал считать значение:
- Остальные ждут `Event`, пока оно не будет установлено.

Пример реализации:
```

import threading
import functools

def thread_safe_cached(func):
cache = {}
in_progress = {}
lock = threading.Lock()

.wraps(func)
def wrapper(*args, **kwargs):
key = (args, frozenset(kwargs.items()))
with lock:
if key in cache:
return cache[key]
if key not in in_progress:
in_progress[key] = threading.Event()
in_progress[key].clear()
creator = True
else:
creator = False

if creator:
try:
result = func(*args, **kwargs)
with lock:
cache[key] = result
finally:
in_progress[key].set()
with lock:
del in_progress[key]
return result
else:
in_progress[key].wait()
with lock:
return cache[key]

return wrapper

```

---

▪️ Пояснения к коду:

- При первом вызове для новых аргументов поток создаёт `Event` и начинает считать результат.
- Остальные потоки видят `Event` и вызывают `wait()`, пока первый поток не установит `set()`.
- Как только результат посчитан, `Event` сигнализирует всем ждущим потокам, что данные готовы.
- Доступ к `cache` и `in_progress` защищён через `lock` для избежания гонок.

---

▪️ Возможные подводные камни:

- Если не удалять `Event` из `in_progress`, кэш постепенно раздуется мусором.
- Если ошибка случится внутри `func`, необходимо всё равно освободить `Event`, иначе потоки будут вечно ждать.
- Нельзя держать `lock` во время выполнения тяжёлой функции `func`, иначе все потоки будут блокироваться.

---

▪️ Вопросы на собеседовании по этой задаче:

- Как изменить реализацию, чтобы кэш имел ограничение по размеру (например, максимум 1000 элементов)?
- Как адаптировать декоратор под асинхронные функции (`async def`)?
- Что будет, если `func` иногда бросает исключения? Как кэшировать ошибки или не кэшировать их?
- Как изменить реализацию так, чтобы кэш удалял устаревшие данные через TTL (Time-To-Live)?

---

@python_be1
🔍 Что выведет код?

@python_be1
Что выведет этот код при запуске на Python 3.10+ (например, 3.11)?

📌 Подсказка: [спойлер: Подумайте о порядке проверок, о том, какие атрибуты попадают в others, и об использовании __match_args__.Ответ:Automatic mode
Mode manual, other keys: ['threshold', 'debug']
Low threshold 0
Краткое пояснение:

Для первого объекта (mode="auto", threshold=10) срабатывает первый case Config(mode="auto") → Automatic mode.

Для второго (mode="manual", threshold=5, debug=True) первый не совпадает, второй с threshold<5 не проходит (5 < 5 → False), зато третий case Config(mode=mode, **others) — биндинг mode='manual', остальные ключи (threshold и debug) попадают в others → Mode manual, other keys: ['threshold', 'debug'].

Для третьего (threshold=0) первый и третий не подходят (нет mode), а второй — case Config(threshold=threshold) if threshold<5 — срабатывает (0<5) → Low threshold 0.]

@python_be1
🖥 PyXL — аппаратный процессор, исполняющий Python без интерпретатора
Разработчик представил PyXL — уникальный аппаратный процессор, который исполняет Python-программы без использования традиционного интерпретатора или виртуальной машины.

Архитектура PyXL:

Python → CPython Bytecode → собственный набор инструкций для прямого исполнения на "железе".

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

Бенчмарк GPIO:

PyXL выполняет переключение GPIO с задержкой всего 480 наносекунд.

Для сравнения: MicroPython на Pyboard — 14–25 микросекунд, несмотря на более высокую частоту (168МГц против 100МГц у PyXL).

Разработчик самостоятельно создал:

Компилятор, линкер и генератор кода

Аппаратную реализацию процессора

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

🎬 Демо и подробности: https://runpyxl.com/gpio

@python_be1
🧪 Pocket Science Lab — карманная лаборатория для экспериментов. Это компактное устройство с открытым исходным кодом, превращающее смартфон или ПК в полноценную лабораторию для физических и инженерных экспериментов.

Проект предлагает приложение с впечатляющим функционалом: осциллограф, генератор сигналов, люксметр, датчики давления и даже управление сервоприводами для робототехники. Интересно реализована работа с реальными данными, например, можно анализировать звуковые волны через микрофон или строить графики на основе показаний акселерометра.

🤖 GitHub (https://github.com/fossasia/pslab-android?tab=readme-ov-file)

@python_be1
Вышла интерсная штука — padws!

Это бесконечная онлайн-доска с встроенным редактором кода и терминалом.

Поддерживает импорт объектов из VSCode и Cursor.

Посмотреть демо можно здесь, а селф-хост версию скачать на GitHub здесь.

https://github.com/pad-ws/pad.ws

#padws #coding #onlinewhiteboard #selfhost

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 TUIFIManager

Это кроссплатформенный терминальный termux-ориентированный файловый менеджер, предназначенный для использования с проектом Uni-Curses

📌 Как использовать:
Запустите tuifi в терминале, или импортируйте его в один из ваших проектов Uni-Curses как компонент, например:
`from TUIFIManager import *`
Установка
sudo pip3 install tuifimanager —upgrade
pip3 install TUIFIManager —upgrade

https://github.com/GiorgosXou/TUIFIManager

@python_be1
🚀 DeepWiki-Open: автоматическая генерация вики-документации с ИИ

Это open-source инструмент для автоматического создания интерактивной вики-документации на основе исходного кода репозитория. Идеально подходит для разработчиков и команд, которые хотят быстро структурировать знания о проекте.

## 🔍 Что умеет DeepWiki
- Анализирует код и его архитектуру
- Генерирует документацию по компонентам и их связям
- Создает визуальные диаграммы (например, с помощью Mermaid)
- Структурирует всё в вики с удобной навигацией

Особенности
Мгновенная генерация вики
Поддержка приватных репозиториев
Интеллектуальный анализ кода с помощью OpenAI и Google Gemini
Автоматические архитектурные диаграммы
Удобный интерфейс

🛠️ Стек технологий
- Backend: Python (FastAPI)
- Frontend: Next.js + React
- Визуализация: Mermaid
- Контейнеризация: Docker, docker-compose

🚀 Быстрый старт
```

git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
echo "GOOGLE_API_KEY=ваш_google_api_key" > .env
echo "OPENAI_API_KEY=ваш_openai_api_key" >> .env
docker-compose up
```

GitHub (https://github.com/AsyncFuncAI/deepwiki-open)

@python_be1
📚 Librum — читалка с облачной библиотекой и 70 000+ бесплатных книг

С этим инструментом ваша библиотека станет по-настоящему мобильной — проект имеет синхронизацию между устройствами, теги, коллекции и даже статистика чтения — всё под рукой, будь то Windows, Linux или macOS.

Проект полностью открытый, а его команда живёт на донаты. При этом здесь уже есть поддержка редких форматов вроде CBZ (для комиксов) и TIFF, а в дорожной карте — TTS и AI-инструменты для заметок.

🤖 GitHub (https://github.com/Librum-Reader/Librum)

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
⭐️ Давным-давно в терминале, в далекой-далекой Галактике…
May the 4th be with you: 4 мая — неофициальный день «Звёздных войн».

ASCII Movie - это проект с открытым исходным кодом, который будет «транслировать» оригинальный фильм «Звёздные войны» (эпизод IV) в виде ASCII-графики прямо в ваш терминал, используя протоколы SSH или Telnet.

Сервис реализован на языке Go и снабжён простым текстовым интерфейсом с поддержкой клавиатуры и мыши, а также доступен в виде Docker-контейнера.

`sudo docker run —rm -it ghcr.io/gabe565/ascii-movie play`

По SSH. #MayThe4th

http://github.com/gabe565/ascii-movie

@python_be1
✍️ novelWriter — минималистичный редактор для писателей с поддержкой Markdown. Проект использует облегченный синтаксис на основе Markdown и сохраняет все данные в виде обычных текстовых файлов, что делает его идеальным для работы с системами контроля версий.

Инструмент делает акцент на простоте и надежности. Вместо проприетарных форматов он использует чистый текст с метаданными в JSON. Редактор написан на Python с использованием Qt6 и доступен для всех основных ОС. При этом проект остается полностью открытым и принимает contributions, особенно в части переводов через Crowdin.

🤖 GitHub (https://github.com/vkbo/novelWriter)

@python_be1
🐳 Как устроен Docker: что происходит «под капотом»

Поговорим немного про базу.

Docker — одно из самых популярных средств контейнеризации. Его простота снаружи скрывает сложную архитектуру. Разберём, как он устроен внутри.

1) Что такое контейнер?

Контейнер — изолированная среда, где запускается приложение со всеми зависимостями.
⚠️ Это не виртуальная машина: контейнер делит ядро ОС с хостом, но видит только свою «песочницу» через изоляцию.

2) Основные компоненты

• Docker Engine
– Docker Daemon (`dockerd`) управляет контейнерами, образами, сетями
– Docker CLI (`docker`) — интерфейс пользователя
– REST API — взаимодействие CLI и Daemon

👉 Пример: `docker run nginx` → CLI отправляет запрос, Daemon находит образ, создаёт контейнер, запускает процесс.

3) Namespaces

Механизм изоляции в Linux, создающий для контейнера:

• свой процессный ID (pid namespace)
• файловую систему (mnt namespace)
• сеть (net namespace)
• hostname (uts namespace)
• IPC (ipc namespace)

👉 Благодаря namespace контейнер видит «свою» мини-ОС, хотя на деле — это лишь виртуальные границы.

4) Cgroups

Ограничивают и учитывают ресурсы (CPU, RAM, I/O, сеть).
Пример: можно задать лимит 512 МБ RAM и 0.5 CPU.
Если приложение превышает лимит — Docker его ограничит или остановит.

5) Union File Systems (OverlayFS)

Docker использует многослойную файловую систему. Каждый шаг `Dockerfile` создаёт новый слой.
При запуске контейнера создаётся верхний writable-слой, остальные read-only.

👉 10 контейнеров на одном образе разделяют слои → экономия места.

6) Container Runtime

Docker использует `runc` для запуска контейнера (соответствует OCI Runtime Spec).
Daemon вызывает `runc`, который через `clone()`, `setns()`, `chroot()` изолирует процесс.

7) Docker Images
Образ — read-only слои, собранные в Union FS.
Каждый слой — изменения относительно предыдущего (например, установка пакета → новый слой).
Хранение: локально (`/var/lib/docker`) или в реестре (Docker Hub, GitLab Container Registry).

8) Docker Networking

Docker создаёт виртуальные сети (bridge, overlay, host).
По умолчанию контейнеры подключаются к bridge и получают IP из внутреннего пула.

👉 Можно пробросить порты через `-p`, создать собственные сети, объединять контейнеры через `docker network connect`.

В Swarm используется Overlay network (сеть между хостами).

9) Безопасность

Docker использует:

• seccomp (ограничение системных вызовов)
• AppArmor / SELinux (контроль привилегий)
• user namespaces (отображение UID контейнера в другой UID хоста)

⚠️ По умолчанию контейнеры имеют широкий доступ (например, `/proc` виден). Для production стоит ограничивать права (например, `--cap-drop`).

10) Что происходит при `docker run nginx`?

1. CLI отправляет запрос через API
2. Daemon ищет образ (локально или в registry)
3. Создаётся read-write слой контейнера
4. Создаются namespace (pid, net, mnt…)
5. Применяются cgroups
6. Вызывается `runc` для изоляции процесса
7. Контейнер подключается к сети
8. Запускается ENTRYPOINT/command

Контейнер живёт, пока жив его процесс.

11) Почему Docker — не магия?

Docker использует стандартные возможности ядра Linux (namespaces, cgroups, chroot, seccomp, overlayfs), оборачивая их в удобный интерфейс.

Контейнер — просто изолированный процесс, а не полноценная VM.
Поэтому Docker лёгкий, быстрый, удобный.

12) Заключение

Под капотом Docker:

• namespaces — изоляция
• cgroups — контроль ресурсов
• runc — запуск
• overlayfs — многослойная ФС
• REST API + Daemon + CLI — взаимодействие

Docker скрывает сложность, давая простой инструмент для запуска, сборки, развёртывания приложений.

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

➡️ Подробнее (https://uproger.com/kak-ustroen-docker-chto-proishodit-pod-kapotom/)

@python_be1
👩‍💻 datasketch (https://github.com/ekzhu/datasketch) — Python-библиотека, содержащая реализации вероятностных структур данных, которые используются для оптимизации работы с большими объемами данных!

🌟 Среди основных возможностей — оценка схожести Jaccard с помощью MinHash и его взвешенной версии, а также оценка кардинальности множества с помощью HyperLogLog и HyperLogLog++. Эти структуры данных позволяют выполнять операции, такие как поиск схожих элементов или подсчет уникальных объектов, быстро и с минимальными затратами памяти.

🔐 Лицензия: MIT

🖥 Github (https://github.com/ekzhu/datasketch)

@python_be1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 AgenticSeek — мощнейший опенсорс ИИ-агент.

Это лучшая бесплатная альтернатива Manus AI за 200$. Есть всё, что нужно — поиск по интернету, поддержка голосового управления + он хороший помощник по кодингу.

И он умеет почти всё:

• Спланирует тур за границу: подберёт билеты, отели, маршруты
• Проведёт аудит бизнеса и предложит варианты оптимизации
• Возьмёт на себя работу в таблицах, анализ данных и отчётов
• Напишет код под любую задачу
• Прочитает книги, статьи, репозитории, просёрфит сайты и соберёт данные
• А теперь представьте: вы даёте ему сотню таких задач одновременно — это уже не ассистент, а полноценный бизнес-комбайн

AgenticSeek полностью управляет браузером и приложениями, интегрируется в ваши процессы и автоматически подбирает агентов под задачи.

Управлять можно голосом
Все приватные данные остаются только у вас

На GitHub уже 1800 звезд.

https://github.com/Fosowl/agenticSeek

@python_be1