Последние посты

Библиотека Python разработчика | Книги по питону
23 сент., 05:32
🔥 Как ускорить Python-код в 10 раз?Сегодня покажу вам мощный инструмент для оптимизации кода - Numba. Это библиотека, которая позволяет компилировать Python-функции в машинный код, используя JIT-компилятор.🚀 Как это работает?Numba использует LLVM для компиляции кода во время выполнения, превращая Python в код, близкий по скорости к C.ПримерДопустим, у нас есть функция, вычисляющая сумму квадратов чисел:import numpy as np import timedef sum_of_squares(n): result = 0 for i in range(n): result += i 2 return resultn = 107 start = time.time() sum_of_squares(n) print("Обычный Python:", time.time() - start)Теперь ускорим её с помощью Numba:from numba import jit@jit(nopython=True) def sum_of_squares_numba(n): result = 0 for i in range(n): result += i 2 return resultstart = time.time() sum_of_squares_numba(n) print("С Numba:", time.time() - start)
Библиотека Python разработчика | Книги по питону
21 сент., 06:49
10 полезных библиотек для Python-разработчикаСегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу разработку проще и эффективнее. Поехали! 🚀1️⃣ Rich – красивый вывод в консоль. Если хотите раскрасить логи, добавить таблицы или анимации – эта библиотека вам пригодится. 📌 pip install rich2️⃣ Typer – современный способ писать CLI-приложения. Работает на основе аннотаций типов и делает разработку CLI удобнее. 📌 pip install typer3️⃣ Pendulum – альтернатива datetime, но с удобным API и встроенной поддержкой часовых поясов. 📌 pip install pendulum4️⃣ HTTPX – асинхронный клиент для работы с HTTP-запросами. Поддерживает async/await, в отличие от requests. 📌 pip install httpx5️⃣ Pydantic – мощный инструмент для валидации данных и работы с моделями. Особенно полезен в FastAPI. 📌 pip install pydantic6️⃣ Poetry – современный менеджер
Библиотека Python разработчика | Книги по питону
16 сент., 19:46
Если у вас есть ресурсоемкая задача для процессора и вы хотите использовать все доступные ядра, то multiprocessing.Pool - это то, что вам нужно. Он создает несколько процессов и автоматически распределяет между ними задачи. Просто создайте пул с Pool(number_of_processes) и выполните p.map с списком входных данных.import math from multiprocessing import Poolinputs = [i 2 for i in range(100, 130)]def f(x): return len(str(math.factorial(x)))# Однопоточное выполнение %timeit [f(x) for x in inputs] # 1.44 s ± 19.2 ms per loop (...)# Параллельное выполнение с 4 процессами p = Pool(4) %timeit p.map(f, inputs) # 451 ms ± 34 ms per loop (...)Также можно не указывать параметр number_of_processes, по умолчанию он равен количеству ядер CPU в системе.
Библиотека Python разработчика | Книги по питону
15 сент., 07:04
Protocol vs ABC: Утиная типизация на стероидах (Static Duck Typing)В классическом ООП (Java, C#) и при использовании abc.ABC в Python мы привыкли к Nominal Subtyping (Именная подтипизация). Чтобы объект считался Bird, он должен явно наследоваться от Bird. Это создает жесткую связность (coupling): ваша реализация должна знать об интерфейсе и импортировать его.С приходом typing.Protocol (Python 3.8+) мы получили Structural Subtyping (Структурная подтипизация).В чем суть? Если класс имеет метод quack(), то это Утка. Неважно, от чего он наследуется. Это и есть та самая «утиная типизация», но теперь поддерживаемая статическим анализатором (mypy, pyright, IDE).Сравним код:❌ Старый путь (ABC):from abc import ABC, abstractmethod# 1. Жестко определяем интерфейс class SenderABC(ABC): @abstractmethod def send(self, msg: str) -> None: pass
Библиотека Python разработчика | Книги по питону
14 сент., 08:38
⚡ Как ускорить код на Python? Используем map, filter, reduce ⚡Привет, друзья! Сегодня расскажу о том, как можно ускорить выполнение кода, заменяя обычные циклы на встроенные функции map(), filter() и reduce(). Эти инструменты позволяют писать более компактный, читаемый и быстрый код.✅ map() Функция map() применяется к каждому элементу последовательности и возвращает новый итератор.❌ Обычный способ:numbers = [1, 2, 3, 4, 5] squared = [] for num in numbers: squared.append(num 2)✅ Быстрее с map():numbers = [1, 2, 3, 4, 5] squared = list(map(lambda x: x 2, numbers))За счёт того, что map() использует C-оптимизированную логику, код выполняется быстрее.
Библиотека Python разработчика | Книги по питону
10 сент., 07:45
Ловушка замыканий: Почему ваши лямбды в цикле сломаны (Late Binding)Вы пишете код, который генерирует список функций (например, колбэки для кнопок в UI или динамические фильтры). Кажется, что все логично, но на выходе получаете сюрприз.Проблемный код:# Хотим создать 3 функции, которые возвращают 0, 1 и 2 соответственно funcs = [] for i in range(3): funcs.append(lambda: i)# Проверяем results = [f() for f in funcs] print(results) # Ожидание: [0, 1, 2] # Реальность: [2, 2, 2]Почему так происходит? Это называется Late Binding (позднее связывание). В Python замыкания (closures) захватывают переменные по ссылке, а не по значению.
Библиотека Python разработчика | Книги по питону
9 сент., 04:47
Профилируем Python в продакшене: почему cProfile не подходит, и чем хорош py-spyКогда на проде начинает течь память или скачет CPU, первая мысль, подключить профайлер. Стандартный cProfile, это детерминированный профайлер. Он хукает каждый вызов функции.📉 Цена: Оверхед может замедлить приложение в 2-5 раз. На нагруженном проде это означает добить сервис окончательно.Для Live-систем нужен Sampling Profiler (сэмплирующий профайлер). Золотой стандарт сейчас - py-spy.Как это работает? py-spy написан на Rust. Он работает как внешний процесс, который читает память вашего Python-процесса (через системные вызовы, аналогично gdb). Он делает «снимки» стека вызовов с высокой частотой (по дефолту 100 раз в секунду).✅ Результат: Оверхед стремится к нулю. Код инструментализировать не нужно. Рестарт сервиса не нужен.Два главных режима работы:1. Live View (как htop, но для функций) Посмот
Библиотека Python разработчика | Книги по питону
8 сент., 05:12
📌 Декораторы в Python: как они работают и зачем нужны?Сегодня я покажу вам, как работают декораторы в Python и зачем они вообще нужны.Декораторы позволяют изменять поведение функций без изменения их кода. Они широко применяются в логировании, кешировании, управлении доступом и многом другом.Допустим, у нас есть функция, которая просто выводит «Hello, world!»:def greet(): print("Hello, world!")Теперь мы хотим, чтобы перед выполнением этой функции выполнялся какой-то код, например, логирование. Вместо изменения greet(), мы создадим декоратор:def log_decorator(func): def wrapper(): print(f"Вызов функции {func.__name__}") return func() return wrapperИ теперь используем его:
Библиотека Python разработчика | Книги по питону
7 сент., 07:42
🐍 Как улучшить читаемость кода в Python?Читаемый код - это не роскошь, а необходимость. Если ваш код трудно понять, даже если он работает, это плохой код. Сегодня разберем несколько простых, но мощных приемов, которые сделают ваш код более понятным.1️⃣ Используйте говорящие имена переменных Плохой пример:a = 10 b = 20 c = a + bХороший пример:price = 10 tax = 20 total_cost = price + taxТеперь сразу понятно, что делает код!2️⃣ Разбивайте код на функции
Библиотека Python разработчика | Книги по питону
3 сент., 07:38
Списковые включения (list comprehensions) могут содержать несколько операторов for и if:In : [(x, y) for x in range(3) for y in range(3)] Out: [ (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2) ]Можно также добавлять условия if для фильтрации значений:In : [ (x, y) for x in range(3) for y in range(3) if x != 0 if y != 0 ] Out: [(1, 1), (1, 2), (2, 1), (2, 2)]
Библиотека Python разработчика | Книги по питону
2 сент., 07:34
Structured Concurrency в Python 3.11+ (TaskGroup vs Gather)Если вы до сих пор используете asyncio.gather() для запуска конкурентных задач, вы, вероятно, теряете контроль над ошибками.Главная проблема gather: если одна таска падает, остальные продолжают работать (если не стоит return_exceptions=False, который убивает всё сразу, но "грязно"). Плюс, отлавливать несколько ошибок одновременно через try / except - это боль.В Python 3.11+ (и через trio / anyio раньше) стандартом стала Structured Concurrency через asyncio.TaskGroup.Как это выглядит:import asyncioasync def task_fail(name, sec): await asyncio.sleep(sec) raise ValueError(f"Error in {name}")async def task_ok(name, sec): await asyncio.sleep(sec) print(f"Task {name} done")
Библиотека Python разработчика | Книги по питону
1 сент., 06:50
Оптимизация SQL-запросов в Django ORMСегодня я покажу вам, как оптимизировать SQL-запросы в Django ORM, чтобы ваш код работал быстрее и эффективнее. Если ваш Django-проект начал тормозить, скорее всего, проблема в количестве и сложности запросов к базе данных.1️⃣ Используйте select_related и prefetch_related Django ORM лениво загружает связанные объекты, что может привести к множественным SQL-запросам (N+1). Вместо этого используйте:# select_related — жадная загрузка (для ForeignKey, OneToOne) posts = Post.objects.select_related("author").all()# prefetch_related — для ManyToMany и Reverse ForeignKey posts = Post.objects.prefetch_related("comments").all()Это значительно уменьшает количество запросов к базе.2️⃣ Используйте only и defer Если вам не нужны все поля модели, загружайте только необходимые:users = User.objects.only("id", "username") # Загружаем только ID и имя
Библиотека Python разработчика | Книги по питону
31 авг., 05:28
Оптимизация кода с помощью генераторов в PythonСегодня хочу показать вам, как использование генераторов может сделать ваш код быстрее, экономнее по памяти и элегантнее.Что такое генераторы? Генераторы — это функции, которые используют yield вместо return. Они не возвращают сразу все значения, а запоминают своё состояние и отдают результат по мере необходимости. Это особенно полезно при обработке больших объемов данных, так как позволяет не загружать всю информацию в память сразу.Пример: экономия памяти Допустим, нам нужно обработать миллион чисел и взять из них только четные. Обычный способ:def get_even_numbers(n): result = [] for i in range(n): if i % 2 == 0: result.append(i) return resultnumbers = get_even_numbers(106) print(len(numbers)) # 500000
Библиотека Python разработчика | Книги по питону
28 авг., 06:14
Python поддерживает несколько способов запуска скрипта. Обычный вариант — это python foo.py; в этом случае foo.py просто выполняется.Однако, можно также использовать python -m foo. Если foo — это не пакет, то foo.py ищется в sys.path и выполняется. Если это пакет, то Python сначала выполняет foo/__init__.py, а затем foo/__main__.py. Обратите внимание, что во время выполнения __init__.py значение __name__ равно foo, но во время выполнения __main__.py оно равно __main__.Можно также запустить Python с каталогом: python dir/ или даже python dir.zip. В этом случае Python ищет dir/__main__.py и выполняет его, если находит.Пример:$ ls foo __init__.py __main__.py $ cat foo/__init__.py print(__name__) $ cat foo/__main__.py print(__name__)$ python -m foo foo __main__ $ python foo/ __main__
Библиотека Python разработчика | Книги по питону
25 авг., 18:43
Модуль io предоставляет два типа файловых объектов в памяти. Такие объекты могут быть полезны для работы с интерфейсами, которые поддерживают только файлы, без необходимости создавать их на диске. Очевидный пример — модульное тестирование.Эти два типа — BytesIO и StringIO, которые работают соответственно с байтами и строками.from io import StringIOf = StringIO() f.write('first\n') # Вывод: 6 f.write('second\n') # Вывод: 7 f.seek(0) # Вывод: 0 print(f.readline()) # Вывод: 'first\n' print(f.readline()) # Вывод: 'second\n'📲 Мы в MAX👉@BookPython
Библиотека Python разработчика | Книги по питону
25 авг., 07:25
🔍Тестовое собеседование на Middle Python с разработчиком из Яндекса завтра вечеромУже завтра вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.Как это будет: 📂 Хачатур, старший разработчик в Яндексе, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Хачатур будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос ХачатуруЭто бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_botРеклама.


Библиотека Python разработчика | Книги по питону
25 авг., 07:00
Если вам нужно итерироваться по нескольким итерируемым объектам одновременно, функция zip может быть хорошим выбором. Она возвращает генератор, который выдаёт кортежи, содержащие по одному элементу из каждого исходного итерируемого объекта:In : eng = ['one', 'two', 'three'] In : ger = ['eins', 'zwei', 'drei'] In : for e, g in zip(eng, ger): ...: print('{e} = {g}'.format(e=e, g=g)) ...: one = eins two = zwei three = dreiОбратите внимание, что zip принимает итерируемые объекты как отдельные аргументы, а не список аргументов. Для распаковки значений можно использовать оператор :In : list(zip(zip(eng, ger))) Out: [('one', 'two', 'three'), ('eins', 'zwei', 'drei')]📲 Мы в MAX👉@BookPython
Библиотека Python разработчика | Книги по питону
24 авг., 05:59
list позволяет хранить массив из любых объектов. Это довольно удобно, но может быть неэффективно. Для компактного представления массивов базовых значений можно использовать модуль array. Поддерживаемые значения включают различные типы C, такие как char, int, long, double и другие. Фактическое представление определяется реализацией C.import arraya = array.array('B') # Создаем массив байтов a.append(240) a.append(159) a.append(144) a.append(180)print(a.tobytes().decode('utf8')) # Выводит: '🐴'📲 Мы в MAX👉@BookPython
Библиотека Python разработчика | Книги по питону
23 авг., 11:05
🚀 Подборка полезных IT каналов в MaxСистемное администрирование, DevOps 📌https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса)Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхакMAXСистемный Администратор | Sysadmin Windows & Linux Server. …Купить рекламу: https://telega.in/m/i_odmin Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Раб…
Библиотека Python разработчика | Книги по питону
21 авг., 07:32
Когда в Python используется переменная, сначала она ищется в текущей области видимости. Если такая переменная не найдена, поиск продолжается во вложенной области. Это повторяется до тех пор, пока не будет достигнуто глобальное пространство имен.x = 1 def scope(): x = 2 def inner_scope(): print(x) # выводит 2 inner_scope() scope()Однако присваивание переменной работает иначе. Новая переменная всегда создается в текущей области видимости, если не указано global или nonlocal:x = 1 def scope(): x = 2 def inner_scope(): x = 3 print(x) # выводит 3 inner_scope() print(x) # выводит 2
