Библиотека Python разработчика | Книги по питону
19.5K subscribers
1.05K photos
391 videos
82 files
987 links
Полезные материалы для питониста по Фреймворкам Django, Flask, FastAPI, Pyramid, Tornado и др.

По всем вопросам @evgenycarter

РКН clck.ru/3Ko7Hq
Download Telegram
🐍 Как ускорить работу с pandas?

Сегодня я покажу вам несколько способов ускорить работу с pandas, если у вас большие объемы данных.

1️⃣ Используйте categorical тип данных
Если у вас есть столбцы с повторяющимися строковыми значениями (например, категории товаров), лучше преобразовать их в category:


df["category"] = df["category"].astype("category")

Это снизит использование памяти и ускорит фильтрацию.

2️⃣ Читайте файлы быстрее
Стандартный pandas.read_csv() не всегда работает быстро. Можно попробовать:

- Указать dtype столбцов
- Использовать usecols для загрузки только нужных колонок
- Применить pyarrow или fastparquet при работе с Parquet-файлами


df = pd.read_csv("data.csv", dtype={"id": "int32", "name": "category"}, usecols=["id", "name"])


3️⃣ Используйте numba и vectorize()
Если у вас есть сложные вычисления, попробуйте numba:


from numba import jit

@jit(nopython=True)
def expensive_function(x):
return x**2 + 10*x + 5

df["new_col"] = df["value"].apply(expensive_function)

Это ускорит обработку в разы!

4️⃣ modin вместо pandas
Если у вас мощный многопоточный процессор, попробуйте modin:


import modin.pandas as pd
df = pd.read_csv("data.csv")

Этот модуль использует все ядра процессора и ускоряет вычисления.

Какие еще трюки используете вы? Делитесь в комментариях!

👉@BookPython
В Python каждое значение имеет логическое (булево) представление. Оно неявно приводится к bool, когда используется в if, bool, not и других логических операциях.

Ложными (False) считаются следующие объекты: None, False, 0 любого типа, а также пустые коллекции ("", [], {} и т. д.), включая пользовательские коллекции с методом __len__, если __len__ возвращает 0.

Можно также определить пользовательскую проверку логического значения для своих объектов, используя магический метод __bool__:


class Rectangle:
def __init__(self, width, height):
self._w = width
self._h = height

def __bool__(self):
return bool(self._w and self._h)

print(bool(Rectangle(2, 3))) # True
print(bool(Rectangle(2, 0))) # False
print(bool(Rectangle(0, 2))) # False


Обратите внимание, что в Python 2 аналогом __bool__ является метод __nonzero__.

👉@BookPython
🔥Podlodka Python Crew — это онлайн-конференции по самым актуальным темам для питонистов.

Разбираем сложные вещи простыми словами, без воды, с уклоном на практику. Сессии проходят в удобное время — утром и вечером.

С 17 по 21 марта пройдет сезон, посвященный оптимизации работы Python-приложений. Разбираем профилирование, внутренности CPython и техники ускорения кода.

🎯Что в программе?

Оптимизации, которые вы могли упустить — Александр Кучин (Литрес) расскажет, какие скрытые проблемы могут замедлять код и как их исправить 🚀

Как работает CPython — от запуска скрипта до управления памятью — Василий Рябов разберет, как Python читает и выполняет код, управляет памятью и garbage collection 📌

Своя Игра: уровни глубины знаний Python-разработчика — Нина Лукина и Евгений Афонасьев в формате викторины объяснят, как Python работает под капотом. Это будет эпично 🎮

Профилирование на Python — Василий Исаев (Точка) объяснит, как находить узкие места в коде и повышать его производительность с помощью профилирования 💡

Подходы, которые можно внедрить сразу после конференции!

🔗 Подробности и билеты: https://podlodka.io/pythoncrew
Как ускорить код на 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-оптимизированную логику, код выполняется быстрее.

filter()
Фильтрует элементы последовательности по заданному условию.

Медленный вариант:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = []
for num in numbers:
if num % 2 == 0:
evens.append(num)


Быстрее с filter():

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = list(filter(lambda x: x % 2 == 0, numbers))

Такой код читается легче и работает быстрее.

reduce()
Позволяет выполнять кумулятивные операции (например, суммирование, умножение).

Классический способ:

numbers = [1, 2, 3, 4, 5]
product = 1
for num in numbers:
product *= num


Быстрее с reduce():

from functools import reduce

numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)

Этот метод полезен, если нужно свести список к одному значению.

💡 Важно: reduce() чаще заменяют sum() или math.prod(), но для сложных операций он остаётся полезным.


Такие функции помогают писать код, который не только быстрее работает, но и легче читается.

👉 @BookPython
Одной из самых непоследовательных частей синтаксиса Python являются литералы кортежей.

По сути, чтобы создать кортеж, вы просто пишете значения, разделенные запятыми: 1, 2, 3. Пока что все понятно. А как насчет кортежа, содержащего только один элемент? Вы просто добавляете завершающую запятую к единственному значению: 1,. Это выглядит несколько некрасиво и может быть подвержено ошибкам, но логика понятна.

А как насчет пустого кортежа? Это просто запятая? Нет, это (). Значит ли это, что круглые скобки создают кортеж так же, как и запятые? Нет, это не так. (4) — это не кортеж, это просто 4.

Пример:

a = [
(1, 2, 3),
(1, 2),
(1),
(),
]

[type(x) for x in a]
# Результат: [tuple, tuple, int, tuple]


Чтобы все стало еще более запутанным, литералы кортежей часто требуют дополнительных круглых скобок. Если вы хотите, чтобы кортеж был единственным аргументом функции, то f(1, 2, 3) не сработает по очевидной причине — вместо этого нужно написать f((1, 2, 3)).

👉 @BookPython
Если у вас есть ресурсоемкая задача для процессора и вы хотите использовать все доступные ядра, то multiprocessing.Pool — это то, что вам нужно. Он создает несколько процессов и автоматически распределяет между ними задачи. Просто создайте пул с Pool(number_of_processes) и выполните p.map с списком входных данных.


import math
from multiprocessing import Pool

inputs = [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 в системе.

👉@BookPython
10 полезных библиотек для Python-разработчика

Сегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу разработку проще и эффективнее. Поехали! 🚀

1️⃣ Rich – красивый вывод в консоль. Если хотите раскрасить логи, добавить таблицы или анимации – эта библиотека вам пригодится.
📌 pip install rich

2️⃣ Typer – современный способ писать CLI-приложения. Работает на основе аннотаций типов и делает разработку CLI удобнее.
📌 pip install typer

3️⃣ Pendulum – альтернатива datetime, но с удобным API и встроенной поддержкой часовых поясов.
📌 pip install pendulum

4️⃣ HTTPX – асинхронный клиент для работы с HTTP-запросами. Поддерживает async/await, в отличие от requests.
📌 pip install httpx

5️⃣ Pydantic – мощный инструмент для валидации данных и работы с моделями. Особенно полезен в FastAPI.
📌 pip install pydantic

6️⃣ Poetry – современный менеджер зависимостей. Упрощает работу с виртуальными окружениями и пакетами.
📌 pip install poetry

7️⃣ Loguru – удобная альтернатива стандартному logging. Позволяет логировать без лишнего кода.
📌 pip install loguru

8️⃣ FastAPI – один из самых быстрых Python-фреймворков для создания API. Использует аннотации типов и async/await.
📌 pip install fastapi

9️⃣ Tqdm – библиотека для удобных progress-bar'ов в терминале. Незаменима при обработке больших данных.
📌 pip install tqdm

🔟 Black – автоматический форматтер кода, который придерживается строгого стиля. Просто устанавливаешь – и больше не думаешь о стиле кода.
📌 pip install black

Какую из этих библиотек вы уже используете? А может, есть другие любимые инструменты? Делитесь в комментариях! 🔥

👉@BookPython
🔥 Как ускорить Python-код в 10 раз?

Сегодня покажу вам мощный инструмент для оптимизации кода — Numba. Это библиотека, которая позволяет компилировать Python-функции в машинный код, используя JIT-компилятор.

🚀 Как это работает?

Numba использует LLVM для компиляции кода во время выполнения, превращая Python в код, близкий по скорости к C.

Пример

Допустим, у нас есть функция, вычисляющая сумму квадратов чисел:

import numpy as np
import time

def sum_of_squares(n):
result = 0
for i in range(n):
result += i ** 2
return result

n = 10**7
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 result

start = time.time()
sum_of_squares_numba(n)
print("С Numba:", time.time() - start)


📊 Результат:

Код на чистом Python выполняется ~5-10 раз медленнее, чем с Numba.
Numba особенно полезна для математических вычислений и обработки массивов.
Простая аннотация @jit(nopython=True) уже даёт мощный прирост скорости!

Где применять?

Численные расчёты
Обработку данных
Алгоритмы машинного обучения

Попробуйте Numba и напишите в комментариях, удалось ли вам ускорить свой код!

👉@BookPython
Подборка Telegram каналов для программистов

https://t.me/bash_srv Bash Советы
https://t.me/win_sysadmin Системный Администратор Windows
https://t.me/lifeproger Жизнь программиста. Авторский канал.
https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://t.me/rabota1C_rus Вакансии для программистов 1С

Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин

https://t.me/linux_odmin Linux: Системный администратор
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux

1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/DevLab1C 1С:Предприятие 8

Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus

Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах

GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin

Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
https://t.me/game_devv Все о разработке игр

Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов

БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning

Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста

QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://t.me/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free

Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров

Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике

Excel лайфхак📌
https://t.me/Excel_lifehack

https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)

Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
PEP 8 – это основополагающий стиль программирования в Python, и следовать ему настоятельно рекомендуется. Инструмент pycodestyle позволяет автоматически проверять код на соответствие этому стандарту.

🔧 Как установить и использовать pycodestyle
Установите инструмент через pip:

pip install pycodestyle

Чтобы проверить весь проект в текущей директории, выполните:

pycodestyle . -qq --statistics

Флаги:
- . — проверка всей текущей директории.
- -qq — подавляет ненужные сообщения, оставляя только ошибки.
- --statistics — выводит краткую сводку по ошибкам.

🧐 Примеры ошибок и их исправление
1️⃣ E302 – Ожидалось 2 пустых строки перед объявлением функции/класса:

def my_function():
print("Hello, world!")

Исправление:


def my_function():
print("Hello, world!")


2️⃣ E501 – Строка слишком длинная (> 79 символов):

print("Это очень длинная строка, которая превышает 79 символов и вызывает ошибку E501")

Исправление:

print(
"Это очень длинная строка, которая превышает 79 символов "
"и вызывает ошибку E501"
)


Альтернативные инструменты
- flake8 – более мощный анализатор кода, объединяет pycodestyle, pyflakes и mccabe.
- black – автоформаттер кода, следит за PEP 8 и правит стиль автоматически.
- isort – сортирует импортированные модули.

🚀 Вывод: Использование pycodestyle и других инструментов помогает поддерживать чистоту и читаемость кода, а также облегчает командную работу.

👉@BookPython
🚀 5 крутых Python-фишек, о которых знают не все

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


1. Используем else в for и while
Многие не знают, что в Python циклы for и while могут иметь блок else. Он выполняется, если цикл не был прерван через break.

Пример:

numbers = [1, 3, 5, 7]

for num in numbers:
if num % 2 == 0:
print("Есть чётное число!")
break
else:
print("Чётных чисел нет.")

🔹 Если в списке нет чётных чисел, сработает else.



2. "Распаковка" переменных
В Python можно присваивать сразу несколько значений одной строкой.

Пример:

a, b, c = 1, 2, 3
print(a, b, c) # 1 2 3


Можно менять местами значения без временной переменной:

x, y = 5, 10
x, y = y, x
print(x, y) # 10 5




3. Используем _ в больших числах
Чтобы числа легче читались, можно разделять разряды _.

Пример:

big_number = 1_000_000_000
print(big_number) # 1000000000

Это просто синтаксический сахар, Python игнорирует _ при вычислениях.



4. Получаем значение из словаря с запасным вариантом
Вместо if key in dict можно использовать .get(), чтобы избежать KeyError.

Пример:

user_data = {"name": "Alice"}

age = user_data.get("age", 18) # Если ключа "age" нет, вернётся 18
print(age) # 18




5. "Распаковка" списка в аргументы функции
Оператор * позволяет передавать элементы списка в функцию как отдельные аргументы.

Пример:

def greet(name, age):
print(f"Привет, {name}! Тебе {age} лет.")

user_info = ["Иван", 25]
greet(*user_info) # Привет, Иван! Тебе 25 лет.

То же работает со словарями через **:

user_dict = {"name": "Ольга", "age": 30}
greet(**user_dict)



🧐 Итог
Эти фишки делают код лаконичнее и понятнее. Какую из них вы уже использовали? Может, знаете ещё что-то крутое? Делитесь в комментариях! 👇

👉@BookPython
Как быстро очистить список в Python?

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

1️⃣ Присвоение пустого списка

lst = [1, 2, 3, 4, 5]
lst = []


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

2️⃣ Использование .clear()

lst = [1, 2, 3, 4, 5]
lst.clear()


Метод .clear() очищает список на месте, не создавая новый объект. Это предпочтительный способ, если список используется в нескольких местах.

3️⃣ Использование del

lst = [1, 2, 3, 4, 5]
del lst[:]


Работает аналогично .clear(), но выглядит чуть менее очевидно.

4️⃣ Удаление списка полностью

lst = [1, 2, 3, 4, 5]
del lst


Этот вариант полностью удаляет переменную lst. Если потом попробовать к ней обратиться, будет ошибка NameError.

🔹 Какой способ лучше?
• Если нужно просто очистить список, используйте .clear().
• Если хотите заменить его новым объектом — lst = [].
• del lst[:] – редкий вариант, но возможен.
• del lst подходит, если список больше не нужен в программе.

Какой вариант используете вы? Пишите в комментариях!

👉@BookPython
Хотите разобраться, как устроены веб-фреймворки и глубже понять Django? На открытом уроке разберёмся с WSGI, HTTP-запросами, маршрутизацией и создадим свой мини-фреймворк.

👉 Вместо сухой теории — код, практика и разбор ключевых механизмов, на которых строятся Django и Flask. Разберёмся, как работают серверы, роутинг и обработка запросов.

Если вы хотите прокачаться в Python-разработке и научиться создавать продвинутые веб-приложения, этот вебинар — идеальный старт.

Спикер Леонид Орлов — опытный преподаватель и разработчик на Python и Django.

🔗 Записывайтесь и получите скидку на большое обучение «Django-разработчик»

https://vk.cc/cJQpKW

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Чтобы объект можно было использовать в качестве ключа словаря, он должен быть хешируемым. Хешируемые объекты поддерживают метод __hash__, который возвращает целое число. Для получения хеша значения используется встроенная функция hash.

Встроенные типы, которые являются неизменяемыми, по умолчанию хешируемы. Все пользовательские объекты тоже хешируемы, но есть нюанс. Если вы определяете метод __eq__ для своего типа, то вы также должны определить __hash__ таким образом, чтобы hash(a) == hash(b) для всех a и b, которые считаются равными. Нарушение этого правила может привести к некорректной работе словаря:


class A:
def __init__(self, x):
self.x = x

def __hash__(self):
return random.randrange(10000)

def __eq__(self, other):
return self.x == other.x



d = {}
d[A(2)] = 2
d.get(A(2), 0)
# Вывод: 0


Обратите внимание: как только вы определяете __eq__ в классе, реализация __hash__ по умолчанию удаляется, так как она больше не подходит (по умолчанию все значения считаются неравными).

👉@BookPython
Python поддерживает цепочные присваивания со следующим синтаксисом:


a = b = c = 42


Выглядит как цепочка присваиваний в C, но работает совершенно иначе. В C результат одного присваивания используется в следующем:


a = (b = (c = 42))


В Python всё не так. Операция присваивания не возвращает результат — это оператор, а не выражение. Вместо этого происходит несколько присваиваний слева направо:


2 0 LOAD_CONST 1 (42)
2 DUP_TOP
4 STORE_FAST 0 (a)
6 DUP_TOP
8 STORE_FAST 1 (b)
10 STORE_FAST 2 (c)


👉@BookPython
Как отлаживать Python-код, не выходя из редактора — с помощью встроенного модуля pdb.

🔍 Быстрая отладка с pdb

Часто, когда код не работает как надо, мы начинаем закидывать print()-ами. Но это неудобно, медленно и мусорит код. Вместо этого вставь в нужное место строчку:


import pdb; pdb.set_trace()


Когда выполнение дойдет до этой строки, ты попадешь в интерактивную консоль отладчика прямо в терминале. Дальше можно:

- n (next) — перейти к следующей строке;
- s (step) — зайти внутрь функции;
- c (continue) — продолжить выполнение;
- l (list) — показать текущий контекст;
- p var — вывести значение переменной var.

💡 Пример


def calc(a, b):
import pdb; pdb.set_trace()
result = a + b
return result

calc(2, 3)


На строке с pdb.set_trace() ты остановишься и сможешь изучить, что происходит внутри.

Зачем это нужно?

- Понять, почему что-то идет не так.
- Посмотреть, какие значения у переменных прямо в момент ошибки.
- Быстро отладить без запуска IDE — удобно в Docker, SSH или при работе с cron.

Попробуй — один раз освоишь, и уже не захочешь возвращаться к print().


👉@BookPython
Некоторые модули Python скомпилированы непосредственно в интерпретатор. Они называются встроенными модулями и не должны путаться со стандартной библиотекой. Полный список таких модулей можно получить с помощью sys.builtin_module_names. Среди них можно отметить sys, gc, time и другие.

Обычно не имеет значения, является ли модуль встроенным, однако стоит учитывать, что import всегда сначала ищет модуль среди встроенных. То есть встроенный модуль sys будет загружен, даже если у вас в каталоге есть файл sys.py. С другой стороны, если у вас, например, есть datetime.py в текущей директории, он действительно может быть загружен вместо стандартного модуля datetime.


👉@BookPython
Сегодня покажу вам удобный способ следить за производительностью Python-кода прямо в терминале — с помощью py-spy.

🔍 Что такое py-spy?

py-spy — это sampling-профайлер для Python, который не требует модификации кода и может подключаться к уже работающим процессам. Он написан на Rust, работает очень быстро и почти не влияет на производительность.



🛠 Установка:


pip install py-spy


Или, если хочется поставить бинарник напрямую:


curl -sSL https://install.python-poetry.org | python3 -




🚀 Примеры использования:

1. Снять снимок с работающего процесса:


py-spy top --pid 12345


Альтернатива htop, но показывает, какие функции Python жрут CPU.

2. Записать flamegraph:


py-spy record -o profile.svg --pid 12345


Откроется красивая SVG-шечка, где видно, куда утекает время выполнения.

3. Запустить скрипт с профилированием:


py-spy top -- python my_script.py



🧠 Зачем это нужно?

- Падает производительность? Посмотри, какие функции грузят процессор.
- Программа зависла? Снимок покажет, где именно.
- Хотите оптимизировать горячие участки? Flamegraph быстро выведет подозреваемых.


🔥 Совет от меня: py-spy умеет работать с контейнерами и виртуальными окружениями, просто указывайте --pid правильного процесса. Идеален для DevOps'а и продакшн-серверов.

👉@BookPython
В Python вы можете легко изменять все стандартные переменные, доступные в глобальном пространстве имён:


>>> print = 42
>>> print(42)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable


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

Тем не менее, даже если вы затеняете (shadow) некоторые встроенные имена, вам всё ещё может понадобиться доступ к оригинальным объектам, на которые они изначально ссылались. Для этого существует модуль builtins:


>>> import builtins
>>> print = 42
>>> builtins.print(1)
1


Также переменная __builtins__ доступна в большинстве модулей. Однако здесь есть нюанс. Во-первых, это деталь реализации CPython, и обычно её вообще не стоит использовать. Во-вторых, __builtins__ может ссылаться либо на builtins, либо на builtins.__dict__, в зависимости от того, как именно был загружен текущий модуль.

👉@BookPython
Подборка Telegram каналов для программистов

https://t.me/bash_srv Bash Советы
https://t.me/win_sysadmin Системный Администратор Windows
https://t.me/lifeproger Жизнь программиста. Авторский канал.
https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://t.me/rabota1C_rus Вакансии для программистов 1С

Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин

https://t.me/linux_odmin Linux: Системный администратор
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux

1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/DevLab1C 1С:Предприятие 8

Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus

Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах

GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin

Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
https://t.me/game_devv Все о разработке игр

Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов

БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning

Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста

QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://t.me/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free

Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров

Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике

Excel лайфхак📌
https://t.me/Excel_lifehack

https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)

Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Обработка исключений в асинхронных программах может быть непростой задачей.

В asyncio, если корутина выбрасывает исключение, оно передаётся в тот код, который ожидает соответствующий future. Если await вызывается в нескольких местах, то каждое из них получит это исключение (так как оно сохраняется внутри объекта исключения). Следующий код напечатает сообщение об ошибке пять раз:


import asyncio

async def error():
await asyncio.sleep(1)
raise ValueError()

async def waiter(task):
try:
await task
except ValueError:
print('error')
else:
print('OK')

async def main():
task = asyncio.get_event_loop().create_task(error())

for _ in range(5):
asyncio.get_event_loop().create_task(waiter(task))

await asyncio.sleep(2)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())


Если исключение выброшено, но задача (task) ни разу не была ожидаема (awaited), исключение будет потеряно. В таком случае при уничтожении задачи вы получите предупреждение: “Task exception was never retrieved”.

Когда вы используете await asyncio.gather(tasks) и одна из задач выбрасывает исключение, оно передаётся наружу. Однако если несколько задач выбросят исключения, вы получите только первое, остальные будут проигнорированы:


import asyncio

async def error(i):
await asyncio.sleep(1)
raise ValueError(i)

async def main():
try:
await asyncio.gather(
error(1),
error(2),
error(3),
)
except ValueError as e:
print(e)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())


Вы можете использовать gather с параметром return_exceptions=True, чтобы получать исключения как обычные значения. Следующий код напечатает: [42, ValueError(2,), ValueError(3,)]


import asyncio

async def error(i):
await asyncio.sleep(1)
if i > 1:
raise ValueError(i)
return 42

async def main():
results = await asyncio.gather(
error(1),
error(2),
error(3),
return_exceptions=True,
)

print(results)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())


👉@BookPython