🐍 GIL в Python: как это влияет на многопоточность
Global Interpreter Lock (GIL) — это механизм в CPython, который ограничивает выполнение Python-кода одним потоком за раз, даже на многопроцессорных системах.
🔹 Зачем нужен GIL?
Он предотвращает проблемы с управлением памятью и упрощает работу интерпретатора. Однако из-за него многопоточные программы не могут эффективно использовать несколько ядер процессора.
🔹 Когда GIL мешает?
✅ Решение:
Если нужна настоящая параллельность, используйте многопроцессорность (
Global Interpreter Lock (GIL) — это механизм в CPython, который ограничивает выполнение Python-кода одним потоком за раз, даже на многопроцессорных системах.
🔹 Зачем нужен GIL?
Он предотвращает проблемы с управлением памятью и упрощает работу интерпретатора. Однако из-за него многопоточные программы не могут эффективно использовать несколько ядер процессора.
🔹 Когда GIL мешает?
•
В CPU-интенсивных задачах (например, обработка данных, вычисления) многопоточность не дает прироста производительности.•
В I/O-интенсивных задачах (сетевые запросы, работа с файлами) GIL почти не влияет, так как потоки могут освобождать блокировку во время ожидания операций ввода-вывода.✅ Решение:
Если нужна настоящая параллельность, используйте многопроцессорность (
multiprocessing
), которая запускает отдельные процессы без GIL, или попробуйте альтернативные реализации Python, такие как Jython или PyPy.🖥 Друзья, если вы только начинаете осваивать Python или уже перешли к фреймворкам и сложным библиотекам, вам помогут авторские материалы многолетнего разработчика и преподавателя Python Дмитрия Читалова.
Уже размещены:
✅Основы Python
✅Продвинутый Python
✅Алгоритмы и структуры данных
❗️Сейчас еженедельно выкладываются уроки по Архитектуре и паттернам проектирования
Подписаться можно здесь.
Уже размещены:
✅Основы Python
✅Продвинутый Python
✅Алгоритмы и структуры данных
❗️Сейчас еженедельно выкладываются уроки по Архитектуре и паттернам проектирования
Подписаться можно здесь.
⚙️ Отладка с sys._getframe в Python
Сегодня в коротком формате разберемся с тем, что же творится внутри CPython, когда функции вызывают друг друга: sys._getframe, f_back, f_globals, f_locals, а также создадим свои декораторы.
#Полезное
Сегодня в коротком формате разберемся с тем, что же творится внутри CPython, когда функции вызывают друг друга: sys._getframe, f_back, f_globals, f_locals, а также создадим свои декораторы.
#Полезное
🔥 Mutable vs Immutable в Python
В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).
🔹 Неизменяемые (immutable): нельзя изменить после создания
✅
🔹 Изменяемые (mutable): можно изменять без создания нового объекта
✅
⚠️ Важный нюанс
Передача изменяемых объектов в функцию может привести к неожиданным изменениям:
✅ Вывод:
В 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
для гибких параметров!↔️ Разница между
🔹
🔹
🔹 Но для immutable-объектов (например,
✅ Используйте
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.
#Полезное
Показываю, как мой 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
делает код чище и безопаснее, улучшая инкапсуляцию!Что выведет код?
Anonymous Quiz
23%
{3}
55%
{1, 2, 3, 4, 5}
23%
{1, 2, 3, 3, 4, 5}
0%
Ошибка выполнения
🔥 Что такое
✅ Обычный класс без
✅ Класс с
➕ Плюсы
⚡️ Используйте
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-строк — читаемость и производительность. Они короче и быстрее, чем
F-строки — это самый лаконичный способ подставить переменные и выражения прямо внутрь строки. Они появились в Python 3.6 и с тех пор стали стандартом.
Синтаксис простой: перед строкой ставится
f
, а внутри фигурных скобок {}
можно писать переменные или даже выражения.name = "Анна"
age = 25
print(f"{name} — {age} лет")
Внутри скобок можно использовать любые валидные выражения:
print(f"{name.upper()} — {age + 5} лет") # АННА — 30 лет
Преимущество f-строк — читаемость и производительность. Они короче и быстрее, чем
.format()
или конкатенация через +.⚙️ Списковые включения (
В Python можно создавать списки в одну строку — с помощью списковых включений. Это короче и читаемее, чем
Можно добавить условие:
Это базовый, но мощный инструмент в Python.
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 можно сразу присвоить значения нескольким переменным в одной строке. Это удобно и делает код короче.
Можно использовать для обмена значениями без временной переменной:
✅ Это стандартный приём в 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, который экономит строки и делает код читаемым.