gram news
Библиотека Python разработчика | Книги по питону channel avatar

Библиотека Python разработчика | Книги по питону

@bookpython

Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍 По всем вопросам @evgenycarter РКН clck.ru/3Ko7Hq

ProjectsRUProgramming

18,100subscribers

Open the Channel

Latest posts

  • Библиотека Python разработчика | Книги по питону

    23 Sept, 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 Sept, 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 – современный менеджер
    639211Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    16 Sept, 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 в системе.
    92311Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    15 Sept, 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
    84551Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    14 Sept, 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-оптимизированную логику, код выполняется быстрее.
    743111Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    10 Sept, 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) захватывают переменные по ссылке, а не по значению.
    907322Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    9 Sept, 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, но для функций) Посмот
    86321Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    8 Sept, 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И теперь используем его:
    84131Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    7 Sept, 07:42

    🐍 Как улучшить читаемость кода в Python?Читаемый код - это не роскошь, а необходимость. Если ваш код трудно понять, даже если он работает, это плохой код. Сегодня разберем несколько простых, но мощных приемов, которые сделают ваш код более понятным.1️⃣ Используйте говорящие имена переменных Плохой пример:a = 10 b = 20 c = a + bХороший пример:price = 10 tax = 20 total_cost = price + taxТеперь сразу понятно, что делает код!2️⃣ Разбивайте код на функции
    86631Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    3 Sept, 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)]
    1,04021Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    2 Sept, 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")
    1,01022Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    1 Sept, 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 и имя
    89621Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    31 Aug, 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 Aug, 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__
    1,28032Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    25 Aug, 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 Aug, 07:25

    🔍Тестовое собеседование на Middle Python с разработчиком из Яндекса завтра вечеромУже завтра вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.Как это будет: 📂 Хачатур, старший разработчик в Яндексе, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Хачатур будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос ХачатуруЭто бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_botРеклама.
    Image from a post by Библиотека Python разработчика | Книги по питонуImage from a post by Библиотека Python разработчика | Книги по питону
    1,34011Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    25 Aug, 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 Aug, 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
    1,060222Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    23 Aug, 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). Раб…
    88031Open in Telegram
  • Библиотека Python разработчика | Книги по питону

    21 Aug, 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
    1,01031Open in Telegram