⚙️ Новый интерпретатор в Python 3.14 — +30 % скорости без магии 🚀
📌 Что происходит:
Этот простой код идеально показывает ускорение от нового интерпретатора в Python 3.14.
Теперь
вместо огромного `switch`-цикла внутри байткода.
💡 Результат:
— +10-30 % прироста скорости на CPU-интенсивных задачах без изменения исходников.
— Улучшено управление кадрами, кеш инструкций и прогноз ветвлений.
🛠 Просто установи Python 3.14+ — никаких зависимостей или изменений кода.
Подпишись 👉🏻 @KodduuPython 🤖
  
import time
def compute(n: int) -> int:
return sum(i * i for i in range(n))
def benchmark():
start = time.perf_counter()
for _ in range(10):
compute(2_000_000)
return time.perf_counter() - start
if __name__ == "__main__":
t = benchmark()
print(f"⏱ Выполнено за: {t:.3f} сек")
📌 Что происходит:
Этот простой код идеально показывает ускорение от нового интерпретатора в Python 3.14.
Теперь
for, sum и арифметика выполняются через новую таблицу компактных C-функций,вместо огромного `switch`-цикла внутри байткода.
💡 Результат:
— +10-30 % прироста скорости на CPU-интенсивных задачах без изменения исходников.
— Улучшено управление кадрами, кеш инструкций и прогноз ветвлений.
🛠 Просто установи Python 3.14+ — никаких зависимостей или изменений кода.
Подпишись 👉🏻 @KodduuPython 🤖
Forwarded from AIGENTTO
Clusteroid для автокластеризации документов в RAG
В RAG часто бывает набор различных документов из разных департаментов компании. Нужно либо использовать разделение на кластеры по департаментам, что часто бывает неточным (например, в HR хранится много разных по типу и содержанию документов), либо сортировать их самостоятельно. Либо же сложить всё вместе в одну кучу.
Третий вариант — самый плохой, так как получится много схожей семантики, и процесс retrieve будет работать плохо (будет попадать много нерелевантных чанков). Первый вариант обычно приемлем, но по сути сводится ко второму: нужен человек, который вручную качественно сортировал бы документы по секциям и пересортировывал при изменениях и добавлениях.
Существуют библиотеки, например, SpaCy, которые могут делать разметку (NER), но без качественной настройки под конкретную тему они работают плохо.
Поэтому мы разработали собственный кластеризатор Clusteroid, который выложили в open source. Он умеет кластеризовать с помощью K-Means или HDBSCAN.
Подпишись 👉🏻 @aigentto 🤖
  
  В RAG часто бывает набор различных документов из разных департаментов компании. Нужно либо использовать разделение на кластеры по департаментам, что часто бывает неточным (например, в HR хранится много разных по типу и содержанию документов), либо сортировать их самостоятельно. Либо же сложить всё вместе в одну кучу.
Третий вариант — самый плохой, так как получится много схожей семантики, и процесс retrieve будет работать плохо (будет попадать много нерелевантных чанков). Первый вариант обычно приемлем, но по сути сводится ко второму: нужен человек, который вручную качественно сортировал бы документы по секциям и пересортировывал при изменениях и добавлениях.
Существуют библиотеки, например, SpaCy, которые могут делать разметку (NER), но без качественной настройки под конкретную тему они работают плохо.
Поэтому мы разработали собственный кластеризатор Clusteroid, который выложили в open source. Он умеет кластеризовать с помощью K-Means или HDBSCAN.
Подпишись 👉🏻 @aigentto 🤖
GitHub
  
  GitHub - alx1379/Clusteroid: Dynamic RAG docs clusterization (meta clusters)
  Dynamic RAG docs clusterization (meta clusters). Contribute to alx1379/Clusteroid development by creating an account on GitHub.
❤2
  🧩 Python 3.14: Отложенная оценка аннотаций (PEP 649)
📌 Что изменилось:
Раньше Python выполнял аннотации при загрузке модуля,
и если типы были объявлены позже (например, класс `User`),
возникала ошибка
В Python 3.14 аннотации хранятся в ленивом виде —
они не вычисляются, пока реально не понадобятся.
Теперь можно писать аннотации даже на ещё не объявленные типы
или динамически создавать их без
✅ Плюсы:
* Больше не нужно импортировать всё ради аннотаций.
* Быстрее стартует программа (аннотации не тратят CPU).
* IDE и типизаторы работают точнее — аннотации доступны при необходимости.
🛠 Работает из коробки в Python 3.14+, без флагов и дополнительных библиотек.
Подпишись 👉🏻 @KodduuPython 🤖
class User:
name: "str"
age: "int"
def greet(u: "User") -> "str":
return f"Hi, {u.name}! You’re {u.age}."
print(greet.__annotations__)
📌 Что изменилось:
Раньше Python выполнял аннотации при загрузке модуля,
и если типы были объявлены позже (например, класс `User`),
возникала ошибка
NameError.В Python 3.14 аннотации хранятся в ленивом виде —
они не вычисляются, пока реально не понадобятся.
Теперь можно писать аннотации даже на ещё не объявленные типы
или динамически создавать их без
from __future__ import annotations.✅ Плюсы:
* Больше не нужно импортировать всё ради аннотаций.
* Быстрее стартует программа (аннотации не тратят CPU).
* IDE и типизаторы работают точнее — аннотации доступны при необходимости.
🛠 Работает из коробки в Python 3.14+, без флагов и дополнительных библиотек.
Подпишись 👉🏻 @KodduuPython 🤖
👍2
  🔥 Python 3.14: экспериментальный JIT-компилятор для “горячего кода”
📌 Что нового:
В Python 3.14 появился экспериментальный JIT —
он отслеживает *“горячие участки”* кода (часто исполняемые функции)
и компилирует их в нативный машинный код во время выполнения.
💡 Что это даёт:
* Ускорение CPU-интенсивных циклов на 20–50 %
* Прирост без внешних библиотек (PyPy, Numba и т.п.)
* Автоматически активируется для «горячих» функций (в будущем через флаг `PYTHONJIT=1`)
🧠 Пока режим JIT экспериментальный, но уже доступен в сборках 3.14+ как часть проекта cpython-jit prototype.
🛠 Для теста — установить Python 3.14 (free-threaded build) и запустить с переменной окружения:
Подпишись 👉🏻 @KodduuPython 🤖
import time
def hot_func(n: int) -> int:
s = 0
for i in range(n):
s += (i * 3) % 7
return s
def bench():
start = time.perf_counter()
for _ in range(50):
hot_func(5_000_000)
print(f"⏱ {time.perf_counter()-start:.3f} сек")
if __name__ == "__main__":
bench()
📌 Что нового:
В Python 3.14 появился экспериментальный JIT —
он отслеживает *“горячие участки”* кода (часто исполняемые функции)
и компилирует их в нативный машинный код во время выполнения.
💡 Что это даёт:
* Ускорение CPU-интенсивных циклов на 20–50 %
* Прирост без внешних библиотек (PyPy, Numba и т.п.)
* Автоматически активируется для «горячих» функций (в будущем через флаг `PYTHONJIT=1`)
🧠 Пока режим JIT экспериментальный, но уже доступен в сборках 3.14+ как часть проекта cpython-jit prototype.
🛠 Для теста — установить Python 3.14 (free-threaded build) и запустить с переменной окружения:
PYTHONJIT=1 python your_script.py
Подпишись 👉🏻 @KodduuPython 🤖
❤2👍1
  🚀 Надёжный HTTP POST с идемпотентностью и экспоненциальным бэкоффом
📌 Коротко: универсальная, готовая к использованию функция для надёжных HTTP POST-запросов. Поддерживает:
* идемпотентность через
* экспоненциальный бэкофф с джиттером,
* различение клиентских (4xx) и серверных (5xx/429) ошибок.
🛠
Подпишись 👉🏻 @KodduuPython 🤖
import requests, time, uuid, logging
logging.basicConfig(level=logging.INFO)
def post_json(url, data, headers=None, retries=5, backoff=0.5, timeout=10, idempotency_key=None):
h = dict(headers or {})
if idempotency_key: h.setdefault("Idempotency-Key", idempotency_key)
else: h.setdefault("Idempotency-Key", str(uuid.uuid4()))
for attempt in range(1, retries+1):
try:
r = requests.post(url, json=data, headers=h, timeout=timeout)
if r.status_code < 400:
return r
if r.status_code < 500 and r.status_code != 429:
r.raise_for_status() # client error — don't retry
# server error or 429 -> retry
logging.warning("POST %s -> %s (attempt %d)", url, r.status_code, attempt)
except (requests.Timeout, requests.ConnectionError) as e:
logging.warning("Request error: %s (attempt %d)", e, attempt)
sleep = backoff * (2 ** (attempt - 1)) * (0.5 + random.random()/1.0)
time.sleep(sleep)
raise RuntimeError(f"POST failed after {retries} attempts: {url}")
📌 Коротко: универсальная, готовая к использованию функция для надёжных HTTP POST-запросов. Поддерживает:
* идемпотентность через
Idempotency-Key,* экспоненциальный бэкофф с джиттером,
* различение клиентских (4xx) и серверных (5xx/429) ошибок.
🛠
pip install requestsПодпишись 👉🏻 @KodduuPython 🤖
❤1
  ⚡️ Кеширование HTTP-запросов с автоочисткой и TTL
📌 Простая обёртка для запросов, которая:
* кеширует ответы на
* автоматически сбрасывает устаревшие данные,
* уменьшает нагрузку на API и ускоряет ответы.
🛠
Подпишись 👉🏻 @KodduuPython 🤖
  
import requests, time
from functools import lru_cache
@lru_cache(maxsize=128)
def _cached_get(url, ttl):
t = time.time()
r = requests.get(url, timeout=5)
return {"data": r.json(), "t": t}
def get_with_cache(url, ttl=60):
r = _cached_get(url, ttl)
if time.time() - r["t"] > ttl:
_cached_get.cache_clear()
return get_with_cache(url, ttl)
return r["data"]
📌 Простая обёртка для запросов, которая:
* кеширует ответы на
ttl секунд,* автоматически сбрасывает устаревшие данные,
* уменьшает нагрузку на API и ускоряет ответы.
🛠
pip install requestsПодпишись 👉🏻 @KodduuPython 🤖
Общая стоимость курсов в программе Junior Python Developer и Data Scientist +интервью тесты более 16 000 рублей 💰
До 31 октября всего 3450 рублей 🔥🔥🔥
Подпишись 👉🏻 @KodduuPython 🤖
До 31 октября всего 3450 рублей 🔥🔥🔥
Подпишись 👉🏻 @KodduuPython 🤖
🧩 Безопасное шифрование конфигураций (.env → .env.enc)
📌 Храни конфиги и API-ключи безопасно:
Ключ лежит отдельно и не коммитится в git.
🛠
Подпишись 👉🏻 @KodduuPython 🤖
from cryptography.fernet import Fernet
import os
def encrypt_env(src=".env", dst=".env.enc", key_file="key.txt"):
key = Fernet.generate_key()
with open(key_file, "wb") as f: f.write(key)
fernet = Fernet(key)
with open(src, "rb") as f: data = f.read()
with open(dst, "wb") as f: f.write(fernet.encrypt(data))
def decrypt_env(dst=".env", src=".env.enc", key_file="key.txt"):
key = open(key_file,"rb").read()
fernet = Fernet(key)
with open(src,"rb") as f: data=f.read()
with open(dst,"wb") as f: f.write(fernet.decrypt(data))
📌 Храни конфиги и API-ключи безопасно:
encrypt_env() — зашифровывает .env,decrypt_env() — расшифровывает перед запуском.Ключ лежит отдельно и не коммитится в git.
🛠
pip install cryptographyПодпишись 👉🏻 @KodduuPython 🤖
👍1
  📦 Автоматическое сжатие и архивирование логов
📌 Автоматическая ротация логов:
* старые
* старше
* экономит место и сохраняет историю.
🛠 всё на стандартной библиотеке — ничего ставить не нужно
Подпишись 👉🏻 @KodduuPython 🤖
import gzip, shutil, os, glob, datetime
def rotate_logs(path="logs/*.log", keep_days=7):
now = datetime.datetime.now()
for file in glob.glob(path):
mtime = datetime.datetime.fromtimestamp(os.path.getmtime(file))
if (now - mtime).days > 0:
gz = f"{file}.{mtime:%Y%m%d}.gz"
with open(file, "rb") as f_in, gzip.open(gz, "wb") as f_out:
shutil.copyfileobj(f_in, f_out)
open(file, "w").close() # truncate log
for gz in glob.glob("logs/*.gz"):
mtime = datetime.datetime.fromtimestamp(os.path.getmtime(gz))
if (now - mtime).days > keep_days:
os.remove(gz)
📌 Автоматическая ротация логов:
* старые
.log → архивируются в .gz;* старше
keep_days удаляются;* экономит место и сохраняет историю.
🛠 всё на стандартной библиотеке — ничего ставить не нужно
Подпишись 👉🏻 @KodduuPython 🤖
👍3❤1
  Forwarded from AIGENTTO
Почему n8n вам не подойдет?
n8n или Нэйтон и прочие low-code/no-code фреймворки хороши в теории, но когда дело доходит до практики, нужно начинать писать свой код и вставлять его в блоки workflow no-code тулов. Например, чтобы сделать это в Yandex Workflow, у Yandex-разработчика ушло 2 дня 😀 Это не шутка — это правда.
Потом понимаешь, что UI/UX таких тулов очень убогий, а за то время, пока ты выясняешь, почему оно не работает, уже можно было написать много кода (тем более сейчас, когда есть LLM IDE).
И самое главное — все хотят кастомных штук: одному нужны стриминг, другому — чтобы внутри бота был task manager для support, третьему — особая красивая кодировка букв. Всё это нельзя сделать в любых no-code/low-code тулах без кода.
Мне кажется, эра no-code тулов, начавшаяся ещё в 00-х и так и не снискавшая успеха, скоро окончательно закончится, потому что писать код благодаря LLM стало просто и дешево. Но всякие консультанты упорно продают no-code: "зачем вам разработчики, сделай всё сам перетаскиванием кубиков" 😀
Подпишись 👉🏻 @aigentto 🤖
  n8n или Нэйтон и прочие low-code/no-code фреймворки хороши в теории, но когда дело доходит до практики, нужно начинать писать свой код и вставлять его в блоки workflow no-code тулов. Например, чтобы сделать это в Yandex Workflow, у Yandex-разработчика ушло 2 дня 😀 Это не шутка — это правда.
Потом понимаешь, что UI/UX таких тулов очень убогий, а за то время, пока ты выясняешь, почему оно не работает, уже можно было написать много кода (тем более сейчас, когда есть LLM IDE).
И самое главное — все хотят кастомных штук: одному нужны стриминг, другому — чтобы внутри бота был task manager для support, третьему — особая красивая кодировка букв. Всё это нельзя сделать в любых no-code/low-code тулах без кода.
Мне кажется, эра no-code тулов, начавшаяся ещё в 00-х и так и не снискавшая успеха, скоро окончательно закончится, потому что писать код благодаря LLM стало просто и дешево. Но всякие консультанты упорно продают no-code: "зачем вам разработчики, сделай всё сам перетаскиванием кубиков" 😀
Подпишись 👉🏻 @aigentto 🤖
👉 4 курса 207 уроков 504 теста и 171 задача 🔥
Именно такой объем в программе Junior Python Developer и Data Scientist +интервью тесты 👈👈👈
Все это со скидкой 50% до конца октября 👏
Подпишись 👉🏻 @KodduuPython 🤖
Именно такой объем в программе Junior Python Developer и Data Scientist +интервью тесты 👈👈👈
Все это со скидкой 50% до конца октября 👏
Подпишись 👉🏻 @KodduuPython 🤖
🔐 Безопасное хранение токенов в системном keyring
📌 Мини-хранилище API-токенов в системном keychain
(использует встроенную безопасную ОС-хранилку — macOS Keychain, Windows Credential Manager, Linux Secret Service).
🛠
Подпишись 👉🏻 @KodduuPython 🤖
  
import keyring, os
def save_token(service, token):
user = os.getlogin()
keyring.set_password(service, user, token)
def get_token(service):
user = os.getlogin()
return keyring.get_password(service, user)
def delete_token(service):
user = os.getlogin()
keyring.delete_password(service, user)
📌 Мини-хранилище API-токенов в системном keychain
(использует встроенную безопасную ОС-хранилку — macOS Keychain, Windows Credential Manager, Linux Secret Service).
🛠
pip install keyringПодпишись 👉🏻 @KodduuPython 🤖
🔍 Улучшаем код с помощью списковых включений
📌 Этот код демонстрирует использование списковых включений для очистки и преобразования списка строк. Он удаляет пробелы и
переводит строки в нижний регистр, игнорируя нестроковые элементы. Это полезно для обработки данных, таких как очистка
пользовательского ввода или подготовки текстовых данных для анализа.
Подпишись 👉🏻 @KodduuPython 🤖
def transform_data(data):
try:
# Пример спискового включения для преобразования
transformed =
return transformed
except Exception as e:
print(f"Ошибка при преобразовании данных: {e}")
return []
# Пример использования
raw_data = [" Apple ", " Banana", "Cherry ", 42, None]
cleaned_data = transform_data(raw_data)
print(cleaned_data) # Вывод: ['apple', 'banana', 'cherry']
📌 Этот код демонстрирует использование списковых включений для очистки и преобразования списка строк. Он удаляет пробелы и
переводит строки в нижний регистр, игнорируя нестроковые элементы. Это полезно для обработки данных, таких как очистка
пользовательского ввода или подготовки текстовых данных для анализа.
Подпишись 👉🏻 @KodduuPython 🤖
❤2
  ⚡️ Эффективная обработка данных с помощью генераторов Python
📌 Этот код демонстрирует, как использовать генераторы для построчного чтения большого файла. Генераторы позволяют эффективно
обрабатывать данные, так как считывают файл по частям, а не загружают его целиком в память. Это особенно полезно для работы с
большими файлами или потоками данных.
Подпишись 👉🏻 @KodduuPython 🤖
  
def read_large_file(file_path: str):
"""Генератор для построчного чтения большого файла."""
try:
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
yield line.strip()
except FileNotFoundError:
print(f"Файл {file_path} не найден.")
except IOError as e:
print(f"Ошибка при чтении файла: {e}")
# Пример использования
if __name__ == "__main__":
file_path = "large_data.txt"
for line in read_large_file(file_path):
print(line) # Обработка строки
📌 Этот код демонстрирует, как использовать генераторы для построчного чтения большого файла. Генераторы позволяют эффективно
обрабатывать данные, так как считывают файл по частям, а не загружают его целиком в память. Это особенно полезно для работы с
большими файлами или потоками данных.
Подпишись 👉🏻 @KodduuPython 🤖
🌐 Обработка нескольких запросов одновременно с asyncio
📌 Этот код демонстрирует, как использовать библиотеку
Вместо последовательного выполнения запросов, что может занять много времени, мы отправляем их параллельно, что значительно
ускоряет выполнение программы. Этот подход полезен при работе с множеством API или веб-ресурсов, когда нужно быстро получить
данные.
🛠 Установка aiohttp:
Подпишись 👉🏻 @KodduuPython 🤖
  
  
  
  
  
import asyncio
import aiohttp
from typing import List
async def fetch_url(session: aiohttp.ClientSession, url: str) -> str:
"""Fetch the content of a URL asynchronously and handle potential errors."""
try:
async with session.get(url) as response:
response.raise_for_status() # Ensure the request was successful
return await response.text() # Return the text content of the response
except aiohttp.ClientError as e:
return f"Request to {url} failed: {str(e)}" # Return error message if request fails
async def fetch_all(urls: List) -> List:
"""Fetch multiple URLs concurrently and return their content."""
async with aiohttp.ClientSession() as session:
tasks = # Create tasks for each URL
return await asyncio.gather(*tasks) # Gather results from all tasks
# Пример использования
urls = [
"https://jsonplaceholder.typicode.com/posts/1",
"https://jsonplaceholder.typicode.com/posts/2",
"https://jsonplaceholder.typicode.com/posts/3"
]
# Запуск асинхронной задачи
result = asyncio.run(fetch_all(urls)) # Use asyncio.run to execute the main coroutine
for content in result:
print(content) # Print each result from the fetched URLs
📌 Этот код демонстрирует, как использовать библиотеку
asyncio и aiohttp для одновременной обработки нескольких HTTP-запросов.Вместо последовательного выполнения запросов, что может занять много времени, мы отправляем их параллельно, что значительно
ускоряет выполнение программы. Этот подход полезен при работе с множеством API или веб-ресурсов, когда нужно быстро получить
данные.
🛠 Установка aiohttp:
pip install aiohttpПодпишись 👉🏻 @KodduuPython 🤖
⚡2
  🌐 Простой веб-скрапер на Python
📌 Этот код представляет собой простой веб-скрапер, который извлекает заголовки статей с указанного веб-сайта. Он делает
HTTP-запрос, получает HTML-код страницы и использует BeautifulSoup для парсинга и извлечения заголовков. Такой скрапер полезен для
сбора данных с новостных сайтов или блогов.
🛠 Установка библиотек:
Подпишись 👉🏻 @KodduuPython 🤖
  
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
def fetch_html(url: str) -> str:
"""Получает HTML-код страницы по указанному URL."""
try:
response = requests.get(url)
response.raise_for_status()
return response.text
except RequestException as e:
print(f"Ошибка при запросе {url}: {e}")
return ""
def parse_article_titles(html: str) -> list:
"""Парсит HTML и извлекает заголовки статей."""
soup = BeautifulSoup(html, 'html.parser')
return
def main():
"""Основная функция для запуска скрапера."""
url = "https://example.com/news"
html = fetch_html(url)
if html:
titles = parse_article_titles(html)
for idx, title in enumerate(titles, start=1):
print(f"{idx}. {title}")
if __name__ == "__main__":
main()
📌 Этот код представляет собой простой веб-скрапер, который извлекает заголовки статей с указанного веб-сайта. Он делает
HTTP-запрос, получает HTML-код страницы и использует BeautifulSoup для парсинга и извлечения заголовков. Такой скрапер полезен для
сбора данных с новостных сайтов или блогов.
🛠 Установка библиотек:
pip install requests beautifulsoup4Подпишись 👉🏻 @KodduuPython 🤖