🐍 Укус питона 🐍
2.6K subscribers
979 photos
18 videos
284 links
🐍 Канал о программировании на языке Python. Тематические уроки и лайфхаки.

👽 Админ - @it_dashka
🔊 Купить рекламу: https://telega.in/c/byteofpython

👉 Чат: @abyteofpython
👉 Поделиться с друзьями: @byteofpython
Download Telegram
🐍 GIL в Python: как это влияет на многопоточность

Global Interpreter Lock (GIL) — это механизм в CPython, который ограничивает выполнение Python-кода одним потоком за раз, даже на многопроцессорных системах.

🔹 Зачем нужен GIL?

Он предотвращает проблемы с управлением памятью и упрощает работу интерпретатора. Однако из-за него многопоточные программы не могут эффективно использовать несколько ядер процессора.

🔹 Когда GIL мешает?

В CPU-интенсивных задачах (например, обработка данных, вычисления) многопоточность не дает прироста производительности.

В I/O-интенсивных задачах (сетевые запросы, работа с файлами) GIL почти не влияет, так как потоки могут освобождать блокировку во время ожидания операций ввода-вывода.

Решение:

Если нужна настоящая параллельность, используйте многопроцессорность (multiprocessing), которая запускает отдельные процессы без GIL, или попробуйте альтернативные реализации Python, такие как Jython или PyPy.
🖥 Друзья, если вы только начинаете осваивать Python или уже перешли к фреймворкам и сложным библиотекам, вам помогут авторские материалы многолетнего разработчика и преподавателя Python Дмитрия Читалова.

Уже размещены:
Основы Python
Продвинутый Python
Алгоритмы и структуры данных

❗️Сейчас еженедельно выкладываются уроки по Архитектуре и паттернам проектирования

Подписаться можно здесь.
⚙️ Отладка с sys._getframe в Python

Сегодня в коротком формате разберемся с тем, что же творится внутри CPython, когда функции вызывают друг друга: sys._getframe, f_back, f_globals, f_locals, а также создадим свои декораторы.

#Полезное
🔥 Mutable vs Immutable в Python

В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).

🔹 Неизменяемые (immutable): нельзя изменить после создания
int, float, str, tuple, frozenset
x = "hello"
x += " world" # Создается новый объект, а не изменяется старый


🔹 Изменяемые (mutable): можно изменять без создания нового объекта
list, dict, set, bytearray
lst = [1, 2, 3]
lst.append(4) # Список изменяется в той же области памяти


⚠️ Важный нюанс

Передача изменяемых объектов в функцию может привести к неожиданным изменениям:

def modify_list(lst):
lst.append(99) # Изменяет оригинальный список!

my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # [1, 2, 3, 99]


Вывод:

Используйте tuple, если данные не должны изменяться.
Будьте осторожны с изменяемыми объектами при передаче в функции.
Если нужно копирование, используйте .copy() или deepcopy().
🔥 *args и **kwargs в Python

🔹 *args — передает позиционные аргументы как кортеж:
def add_numbers(*args):
return sum(args)

print(add_numbers(1, 2, 3)) # 6


🔹 **kwargs — передает именованные аргументы как словарь:
def greet(**kwargs):
print(kwargs)

greet(name="Alice", age=25) # {'name': 'Alice', 'age': 25}


Используйте *args для списка значений и **kwargs для гибких параметров!
↔️ Разница между is и == в Python

🔹 == (равенство) проверяет, равны ли значения объектов:
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True (значения одинаковые)


🔹 is (идентичность) проверяет, указывают ли переменные на один и тот же объект в памяти:
print(a is b)  # False (разные объекты)


🔹 Но для immutable-объектов (например, int, str, tuple) Python кеширует значения:
x = 256
y = 256
print(x is y) # True (указывают на один объект)


Используйте == для сравнения значений и is для проверки, ссылаются ли переменные на один объект в памяти!
⚙️ Как я запускаю 15+ самых разных ИИ на своей машине — open-source, self-hosted, с HTTP-доступом

Показываю, как мой BrainBox запускает генерацию, озвучку и распознавание локально — без боли и зависимости от облаков. Даже если вы не знаете Python.

#Полезное
Что делает @property в Python?

@property превращает метод класса в свойство, позволяя обращаться к нему без скобок.

Пример:
class Person:
def init(self, name):
self._name = name

@property
def name(self):
return self._name

p = Person("Alice")
print(p.name) # Alice (как атрибут, но с логикой)


Зачем нужно?

Позволяет использовать методы как атрибуты
Защищает данные от прямого изменения
Позволяет добавить логику без изменения интерфейса

⚡️ @property делает код чище и безопаснее, улучшая инкапсуляцию!
🔥 Что такое slots в Python и зачем он нужен?

slots ограничивает список атрибутов у экземпляров класса, экономя память за счет отказа от dict.

Обычный класс без slots:
class Person:
def init(self, name, age):
self.name = name
self.age = age

p = Person("Alice", 25)
p.city = "New York" # Можно добавить новый атрибут


Класс с slots:
class Person:
slots = ("name", "age") # Разрешены только эти атрибуты

def init(self, name, age):
self.name = name
self.age = age

p = Person("Alice", 25)
p.city = "New York" # AttributeError: 'Person' object has no attribute 'city'


Плюсы slots

Экономит память (не создается dict)
Ускоряет доступ к атрибутам
Предотвращает создание лишних атрибутов

⚡️ Используйте slots, если нужно много однотипных объектов и важна производительность!
🐍 Форматированные строки (f-strings) в Python

F-строки — это самый лаконичный способ подставить переменные и выражения прямо внутрь строки. Они появились в Python 3.6 и с тех пор стали стандартом.

Синтаксис простой: перед строкой ставится f, а внутри фигурных скобок {} можно писать переменные или даже выражения.

name = "Анна"
age = 25

print(f"{name} — {age} лет")


Внутри скобок можно использовать любые валидные выражения:
print(f"{name.upper()} — {age + 5} лет")  # АННА — 30 лет


Преимущество f-строк — читаемость и производительность. Они короче и быстрее, чем .format() или конкатенация через +.
Что выведет следующий код?
Anonymous Quiz
86%
ront
0%
roen
14%
ronten
0%
rond
⚙️ Списковые включения (list comprehensions)

В Python можно создавать списки в одну строку — с помощью списковых включений. Это короче и читаемее, чем for-цикл.

squares = [x**2 for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]


Можно добавить условие:
evens = [x for x in range(10) if x % 2 == 0]


Это базовый, но мощный инструмент в Python.
🐍 Множественное присваивание в Python

В Python можно сразу присвоить значения нескольким переменным в одной строке. Это удобно и делает код короче.

x, y, z = 1, 2, 3
print(x, y, z) # 1 2 3


Можно использовать для обмена значениями без временной переменной:
a, b = 5, 10
a, b = b, a
print(a, b) # 10 5


Это стандартный приём в Python, который экономит строки и делает код читаемым.