🐍 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, frozensetx = "hello"
x += " world" # Создается новый объект, а не изменяется старый
🔹 Изменяемые (mutable): можно изменять без создания нового объекта
✅
list, dict, set, bytearraylst = [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.
#Полезное
👍1
Что делает
Пример:
Зачем нужно?
⚡️
@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
24%
{3}
55%
{1, 2, 3, 4, 5}
22%
{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.