list позволяет хранить массив из любых объектов. Это довольно удобно, но может быть неэффективно. Для компактного представления массивов базовых значений можно использовать модуль array. Поддерживаемые значения включают различные типы C, такие как char, int, long, double и другие. Фактическое представление определяется реализацией C.
import array
a = array.array('B') # Создаем массив байтов
a.append(240)
a.append(159)
a.append(144)
a.append(180)
print(a.tobytes().decode('utf8')) # Выводит: '🐴'
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥2
Если вам нужно итерироваться по нескольким итерируемым объектам одновременно, функция
Обратите внимание, что
Для распаковки значений можно использовать оператор
📲 Мы в MAX
👉@BookPython
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')]
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Уже завтра вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤣1
Модуль
Эти два типа —
📲 Мы в MAX
👉@BookPython
io предоставляет два типа файловых объектов в памяти. Такие объекты могут быть полезны для работы с интерфейсами, которые поддерживают только файлы, без необходимости создавать их на диске. Очевидный пример — модульное тестирование.Эти два типа —
BytesIO и StringIO, которые работают соответственно с байтами и строками.
from io import StringIO
f = 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'
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Python поддерживает несколько способов запуска скрипта. Обычный вариант — это
Однако, можно также использовать
Можно также запустить Python с каталогом:
Пример:
📲 Мы в MAX
👉@BookPython
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__
$ python foo/__init__.py
__main__
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Оптимизация кода с помощью генераторов в Python
Сегодня хочу показать вам, как использование генераторов может сделать ваш код быстрее, экономнее по памяти и элегантнее.
Что такое генераторы?
Генераторы — это функции, которые используют
Пример: экономия памяти
Допустим, нам нужно обработать миллион чисел и взять из них только четные. Обычный способ:
Такой код загружает в память весь список, что может быть проблемой при больших данных.
А теперь переделаем на генератор:
Здесь список не создается, а элементы выдаются по одному. Это экономит память и ускоряет обработку!
Где применять?
✔️ Чтение больших файлов построчно (
✔️ Работа с потоками данных
✔️ Генерация последовательностей без создания списков
📲 Мы в MAX
👉@BookPython
Сегодня хочу показать вам, как использование генераторов может сделать ваш код быстрее, экономнее по памяти и элегантнее.
Что такое генераторы?
Генераторы — это функции, которые используют
yield вместо return. Они не возвращают сразу все значения, а запоминают своё состояние и отдают результат по мере необходимости. Это особенно полезно при обработке больших объемов данных, так как позволяет не загружать всю информацию в память сразу. Пример: экономия памяти
Допустим, нам нужно обработать миллион чисел и взять из них только четные. Обычный способ:
def get_even_numbers(n):
result = []
for i in range(n):
if i % 2 == 0:
result.append(i)
return result
numbers = get_even_numbers(10**6)
print(len(numbers)) # 500000
Такой код загружает в память весь список, что может быть проблемой при больших данных.
А теперь переделаем на генератор:
def get_even_numbers_gen(n):
for i in range(n):
if i % 2 == 0:
yield i
numbers = get_even_numbers_gen(10**6)
print(sum(1 for _ in numbers)) # 500000
Здесь список не создается, а элементы выдаются по одному. Это экономит память и ускоряет обработку!
Где применять?
✔️ Чтение больших файлов построчно (
yield line) ✔️ Работа с потоками данных
✔️ Генерация последовательностей без создания списков
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Оптимизация SQL-запросов в Django ORM
Сегодня я покажу вам, как оптимизировать SQL-запросы в Django ORM, чтобы ваш код работал быстрее и эффективнее. Если ваш Django-проект начал тормозить, скорее всего, проблема в количестве и сложности запросов к базе данных.
1️⃣ Используйте
Django ORM лениво загружает связанные объекты, что может привести к множественным SQL-запросам (N+1). Вместо этого используйте:
Это значительно уменьшает количество запросов к базе.
2️⃣ Используйте
Если вам не нужны все поля модели, загружайте только необходимые:
А если хотите исключить несколько полей:
3️⃣ Агрегация вместо перебора в Python
Вместо:
Используйте
Это выполнится на стороне базы, а не в Python, что намного быстрее.
4️⃣ Используйте
Если вам нужно проверить, есть ли записи в базе, не используйте
❌ Плохо:
5️⃣ Кешируйте запросы
Django поддерживает кеширование, и если запросы повторяются, можно использовать:
Эти простые приемы помогут вам ускорить Django-приложение и уменьшить нагрузку на базу данных. А вы уже используете их в своих проектах? Делитесь в комментариях! 👇
📲 Мы в MAX
👉@BookPython
Сегодня я покажу вам, как оптимизировать SQL-запросы в Django ORM, чтобы ваш код работал быстрее и эффективнее. Если ваш Django-проект начал тормозить, скорее всего, проблема в количестве и сложности запросов к базе данных.
1️⃣ Используйте
select_related и prefetch_relatedDjango 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 и имя
А если хотите исключить несколько полей:
users = User.objects.defer("bio", "last_login") # Исключаем ненужные поля
3️⃣ Агрегация вместо перебора в Python
Вместо:
total_likes = sum(post.likes.count() for post in posts)
Используйте
annotate:
from django.db.models import Count
posts = Post.objects.annotate(total_likes=Count("likes"))
Это выполнится на стороне базы, а не в Python, что намного быстрее.
4️⃣ Используйте
exists() вместо count()Если вам нужно проверить, есть ли записи в базе, не используйте
count(), это дорогостоящий запрос:
if User.objects.filter(email="test@example.com").exists(): # Быстро
❌ Плохо:
if User.objects.filter(email="test@example.com").count() > 0: # Долго
5️⃣ Кешируйте запросы
Django поддерживает кеширование, и если запросы повторяются, можно использовать:
from django.core.cache import cache
users = cache.get("users")
if not users:
users = list(User.objects.all()) # Загружаем пользователей
cache.set("users", users, timeout=60 * 15) # Кешируем на 15 минут
Эти простые приемы помогут вам ускорить Django-приложение и уменьшить нагрузку на базу данных. А вы уже используете их в своих проектах? Делитесь в комментариях! 👇
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1