3. Коротко обо мне
• Технический руководитель группы SmartData в Центр
Недвижимости от Сбербанка
• Python
• Machine Learning & Data Science
• C++
4. О докладе
• Для кого:
• Junior, middle python developer - узнать новое
• Senior python - освежить знания
5. О докладе
• Вы узнаете:
• Почему память это важно
• Как узнать её потребление вашей программой
• Почему её потребляется так много
• Как снизить потребление памяти
6. Иерархия памяти
Жесткий диск
10 000 000 тактов / 1000 GB
Оперативная память
200 тактов / 8 GB
L1 - L3 кеши
4-50 тактов / 32 KB - 8 MB
Регистры
0 тактов / десятки штук
12. Память
• Как узнать сколько памяти потребляет отдельный
объект?
• Решение из стандартной библиотеки:
import sys
sys.getsizeof([1,2,3])
• Показывает shallow-size
13. PYMPLER
• asizeof - измерение размера (deep-size)
• tracker - информация об общем потреблении памяти
(ищем утечки)
• classtracker - информация об измении потреблеия
памяти в течении жизни объекта
16. Python
• Потребление памяти «снаружи» и «внутри» - два
разных потребления памяти :-)
• Python не возвращает память в операционную
систему
• Она хранится выделенной для использования под
новые объекты
29. Tuple vs List
• Tuple более экономичен (буфер фиксированного
размера)
• Immutable tuple может быть оптимизирован python
• tuple - отличный аналог структур в других языках
33. Работа с большим
байтовым массивом
• При традиционной работе (bytes) - много копирований
- большое потребление памяти
• Выход есть - memoryview:
• «Специальный объект, предназначенный для
работы с внутренними данными (байтами) без их
копирования»
34. Struct
• Основное назначение - извлечение python-объектов из байт
• struct.pack(fmt, v1, v2, … )
• struct.unpack(fmt, buff)
data = struct.pack("llll", x1, y1, x2, y2)
nx1, nx2, nx3, nx4 = struct.unpack("llll", buff)
35. Интернирование строк
• При анализе .py файла интерпретатор, встречая
одинаковые строки, вставляет ссылку на один и тот
же объект в памяти
• Этот механизм легко сломать
a = "abcdefhijkabcdefhijkabcdefhijkabcdefhijk"
b = "abcdefhijkabcdefhijkabcdefhijkabcdefhijk"
>>> id(a) == id(b)
<<< True
a = "a" * 40
b = "a" * 40
>>> id(a) == id(b)
<<< False
36. Числа от -5 до 257
• Числа от -5 до 257 существуют в единственном
экземпляре
• Сломать это нельзя
>>> id(1) == id(1)
<<< True
>>> id(1000-998) == id(1002 - 1000)
<<< True
>>> id(2*3*3) == id(3*3*2)
<<< True