Python RU
Все для python разработчиков админ - @haarrp @python_job_interview - Python собеседования @ai_machinelearning_big_data - машинное обучение @itchannels_telegram - 🔥лучшие ит-каналы @programming_books_it - it книги @pythonl РКН: clck.ru/3Fmy2j
Показати більше📈 Аналітичний огляд Telegram-каналу Python RU
Канал Python RU (@pro_python_code) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 12 332 підписників, посідаючи 10 183 місце в категорії Технології та додатки та 52 330 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 12 332 підписників.
За останніми даними від 28 жовтня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -15, а за останні 24 години на 2, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 7.53%. Протягом перших 24 годин після публікації контент зазвичай збирає 3.30% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 928 переглядів. Протягом першої доби публікація в середньому набирає 407 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 4.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як api, docker, github, sql, linux.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Все для python разработчиков
админ - @haarrp
@python_job_interview - Python собеседования
@ai_machinelearning_big_data - машинное обучение
@itchannels_telegram - 🔥лучшие ит-каналы
@programming_books_it - it книги
@pythonl
РКН: clck.ru/3Fmy2j”
Завдяки високій частоті оновлень (останні дані отримано 29 жовтня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
from contextlib import contextmanager
import sys
import io
@contextmanager
def capture_stdout():
old_stdout = sys.stdout
sys.stdout = buffer = io.StringIO()
try:
yield buffer
finally:
sys.stdout = old_stdout
# Пример использования
with capture_stdout() as out:
print("Это вывод, который перехвачен")
captured_output = out.getvalue()
print("Перехваченный текст:", captured_output)
🧠 Объяснение:
Этот хак позволяет временно перенаправить стандартный вывод print() внутрь объекта StringIO, чтобы «тихо» перехватить и сохранить его. Полезно для:
• тестирования CLI-приложений
• логирования скрытого вывода
• подавления шума в stdout во время исполнения кода
Работает как контекстный менеджер, не требует сторонних библиотек, и легко встраивается в production-код.
python -m cProfile your_script.py
Форматированный вывод с pstats:
python -m cProfile -o result.prof your_script.py
python -m pstats result.prof
Для Jupyter:
%load_ext cprofile
%cprofile some_function()
🐍 py-spy — суперлёгкий sampling-профайлер
✅ Не требует изменений в коде
✅ Работает с чужими процессами
✅ Без тормозов, можно запускать в проде
py-spy top --pid <PID>
py-spy record -o profile.svg -- python your_script.py
👉 Показывает flame graph: удобная визуализация bottleneck-функций.
🔥 `Scalene` — профайлинг CPU, памяти и аллокаций
✅ Отслеживает:
- сколько времени тратит CPU
- где происходят аллокации
- сколько памяти реально используется
pip install scalene
scalene your_script.py
👉 Выделяет проблемные строки, показывает выделение памяти по строчкам кода, а не только по функциям.
🧮 `memory_profiler` — анализ использования памяти
✅ Показывает, сколько памяти потребляет каждая строка
✅ Полезен для data science скриптов
pip install memory-profiler
Добавь декоратор:
from memory_profiler import profile
@profile
def my_func():
...
Запуск:
python -m memory_profiler your_script.py
💡 Как выбрать?
| Инструмент | Что профилирует | Подходит для |
|--------------------|----------------------|------------------------------|
| `cProfile` | Время (встроенно) | Быстрый старт, базовый анализ |
| `py-spy` | Время (sampling) | Прод, чужие процессы, flame graphs |
| `Scalene` | Время + память + аллокации | Глубокий анализ по строкам |
| `memory_profiler` | Только память | Data science, отладка RAM |
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]
🧪 Дальше всё просто:
docker build -t my-python-app .
docker run -it my-python-app
🎯 Добавь .dockerignore, настрой .env, используй docker-compose, а для продакшена — оптимизируй образ под размер и безопасность.
📌 Если твой Python-проект всё ещё живёт в "сыром" виде — пора пересесть на контейнеры.
🔗 Полный гайд:
https://www.kdnuggets.com/why-how-to-containerize-your-existing-python-apps# Clone repo
git clone https://github.com/Tencent-Hunyuan/HunyuanPortrait
# Install requirements
pip3 install torch torchvision torchaudio
pip3 install -r requirements.txt
# Run
video_path="your_video.mp4"
image_path="your_image.png"
python inference.py \
--config config/hunyuan-portrait.yaml \
--video_path $video_path \
--image_path $image_path
🟡Страница проекта
🟡Набор моделей
🟡Arxiv
🖥GitHub
@ai_machinelearning_big_data
#AI #ML #HunyuanPortrait
pip install TTS torchaudio gradio difflib
🧪 Пример скрипта
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts
import difflib
# Инициализация TTS
config = XttsConfig()
model = Xtts.init_from_config(config)
model.load_checkpoint("tts_models/multilingual/multi-dataset/xtts_v2")
# Текст диктанта
text = "Artificial intelligence is transforming education worldwide."
# Генерация речи
speaker_embedding = model.get_speaker_embedding("native_speaker.wav")
audio = model.tts(text, speaker_embedding=speaker_embedding)
model.save_wav(audio, "dictation.wav")
# Пользователь вводит услышанное
user_input = input("Введите, что вы услышали: ")
# Сравнение
diff = difflib.ndiff(text.split(), user_input.split())
print("\n📊 Сравнение:")
print("\n".join(diff))
# Расчёт точности
matcher = difflib.SequenceMatcher(None, text, user_input)
accuracy = matcher.ratio() * 100
print(f"\n✅ Точность: {accuracy:.2f}%")
🎯 Расширения, которые можно добавить
• использовать микрофон и распознавание речи (Whisper)
• генерировать несколько уровней сложности
• выводить количество ошибок по категориям: пунктуация, слова, пропуски
• озвучивать ошибки вслух после проверки
• вести личную статистику прогресса по дням
🧠 Зачем это нужно
• идеально для изучающих иностранные языки
• может использоваться как проверка ученика в интерактивной форме
• подойдёт даже для диктовок детям или взрослым
matrix = [[0] * 3] * 3
matrix[0][0] = 1
for row in matrix:
print(row)
❓ Вопросы
1. Почему изменяется весь первый столбец, а не только [0][0]?
2. Как работает [[0]*3]*3 и почему это опасно?
3. Как правильно создать независимую матрицу 3×3 из нулей?
🔍 Разбор
✅ Ожидаемый (и удивительный!) вывод:
[1, 0, 0] [1, 0, 0] [1, 0, 0]🔧 Почему так происходит - Выражение
[[0] * 3] * 3 создаёт три ссылки на один и тот же вложенный список.
- matrix[0][0] = 1 меняет все строки, потому что они указывают на один и тот же объект в памяти.
⚠️ Подвох
Это один из самых частых скрытых багов в Python, особенно при создании вложенных списков.
🧠 Решение
Нужно использовать генератор списка, чтобы создать три независимых объекта:
matrix = [[0] * 3 for _ in range(3)]
Теперь matrix[0][0] = 1 затронет только первую строку:
[1, 0, 0] [0, 0, 0] [0, 0, 0]📌 Всегда проверяй, создаёшь ли ты уникальные объекты, особенно если работаешь с вложенными структурами.
defaultdict, побочные эффекты, mutability, ловушки с list и dict
📌 Условие
Рассмотрим следующий код:
from collections import defaultdict
def make_dict():
return {"count": 0}
d = defaultdict(make_dict)
d["a"]["count"] += 1
d["b"]["count"] += 1
d["a"]["count"] += 1
print(d)
❓ Вопросы
1. Что будет выведено на экран?
2. Почему результат может оказаться неожиданным при использовании других вариантов реализации?
3. Что изменится, если использовать make_dict() без функции-обёртки?
🔍 Разбор
✅ Ожидаемый вывод:
defaultdict(<function make_dict at 0x...>, {'a': {'count': 2}, 'b': {'count': 1}})
🔧 Почему так происходит
- defaultdict вызывает make_dict() каждый раз, когда ключа нет в словаре.
- Для каждого нового ключа (`"a"` и "b"`) создаётся **новый** словарь `{"count": 0}.
- d["a"]["count"] += 1 увеличивает значение "count" у собственного словаря a.
⚠️ Подвох
Если бы вместо make_dict использовали один и тот же объект (например, через `lambda: some_dict`), то все ключи ссылались бы на один и тот же словарь — и значения начали бы "перетекать" между ключами:
shared = {"count": 0}
d = defaultdict(lambda: shared)
Тогда итог мог бы быть таким:
{'a': {'count': 2}, 'b': {'count': 2}} # неожиданно!
🧠 Вывод
- Никогда не используйте изменяемый объект напрямую как значение по умолчанию в defaultdict.
- Используй функции-фабрики, чтобы избежать общих ссылок между элементами.
- Проверяй поведение при работе со сложными структурами (`list`, `dict`) в качестве значений по умолчанию.
# Правильно:
defaultdict(lambda: {"count": 0})
# Ошибочно:
defaultdict(lambda: some_shared_dict)
📌 Используй copy.deepcopy() или фабричные функции, если создаёшь вложенные структуры.