SlideShare a Scribd company logo
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
Память и Python
Что надо знать для
счастья?
Кузьмин Алексей
Коротко обо мне
• Технический руководитель группы SmartData в Центр
Недвижимости от Сбербанка

• Python

• Machine Learning & Data Science

• C++
О докладе
• Для кого:

• Junior, middle python developer - узнать новое

• Senior python - освежить знания
О докладе
• Вы узнаете:

• Почему память это важно

• Как узнать её потребление вашей программой

• Почему её потребляется так много

• Как снизить потребление памяти
Иерархия памяти
Жесткий диск
10 000 000 тактов / 1000 GB
Оперативная память
200 тактов / 8 GB
L1 - L3 кеши
4-50 тактов / 32 KB - 8 MB
Регистры
0 тактов / десятки штук
Проблемы с памятью
• SWAP

• Повышенное использование

• Утечки

• Out of memory
Python и память
Python
class Address:
def __init__(self, city=None, street=None,
house=None, flat=None):
self.city = city
self.street = street
self.house = house
self.flat = flat
a = Address(
city="Moscow",
street="3-ya ulitsa stroiteley",
house="25",
flat="12"
)
Objects
Objgraph
• Визуализация объектов (и ссылок)

• Учет объектов

• Помощь в поиске утечек
Память
• Как узнать сколько памяти потребляет отдельный
объект?

• Решение из стандартной библиотеки:
import sys
sys.getsizeof([1,2,3])
• Показывает shallow-size
PYMPLER
• asizeof - измерение размера (deep-size)

• tracker - информация об общем потреблении памяти
(ищем утечки)

• classtracker - информация об измении потреблеия
памяти в течении жизни объекта
PYMPLER
>>> asizeof.asizeof(None)
<<< 16
>>> asizeof.asizeof(3)
<<< 32
>>> asizeof.asizeof(3.14)
<<< 24
>>> asizeof.asizeof([])
<<< 64
>>> asizeof.asizeof({})
<<< 288
>>> asizeof.asizeof(tuple())
<<< 48
PyObject
Счетчик ссылок
Информация о типе
Данные GarbageCollector’а
(не всегда)
Ваши данные
Python
• Потребление памяти «снаружи» и «внутри» - два
разных потребления памяти :-)

• Python не возвращает память в операционную
систему

• Она хранится выделенной для использования под
новые объекты
PYMALLOC
Механизмы
освобождения памяти
• Счетчик ссылок
Механизмы
освобождения памяти
• Garbage Collector
a = []
b = []
a.append(b)
b.append(a)
А есть ли проблема?
Общее потребление
• «Диспетчер задач»

• htop

• docker stats

• …
Конкретные функции
• memory_profiler
$ python -m memory_profiler mem_test.py
Filename: mem_test.py
Line # Mem usage Increment Line Contents
================================================
3 45.930 MiB 0.000 MiB @profile
4 def function():
5 84.559 MiB 38.629 MiB x=list(range(1000000))
6 92.008 MiB 7.449 MiB y=copy.deepcopy(x)
7 92.008 MiB 0.000 MiB return y
mprof
• Потребление в течении времени
$ mprof run mem_test.py
$ mprof plot
Анализ объектов
from pympler import muppy
from pympler import summary
all_objects1 = muppy.get_objects()
data = list(range(1000))
all_objects2 = muppy.get_objects()
sum1 = summary.summarize(all_objects1)
sum2 = summary.summarize(all_objects2)
summary.print_(summary.get_diff(sum1, sum2))
$ python mem_test.py
types | # objects | total size
============ | =========== | ============
<class 'list | 2 | 287.59 KB
<class 'int | 823 | 22.50 KB
Немного практики
Rect
class Rect1:
def __init__(self, x1, y1, x2, y2):
self.x1 = x1
self.x2 = x2
self.y1 = y1
self.y2 = y2
>>> asizeof.asizeof(Rect1(0, 0, 0, 0))
<<< 496
SLOTS
• Ускорение доступа к атрибутам

• Сокращение используемой памяти
class Foo(object):
__slots__ = 'bar', 'baz'
Slots Rect
class Rect2:
__slots__ = ("x1", "x2", "y1", "y2")
def __init__(self, x1, y1, x2, y2):
self.x1 = x1
self.x2 = x2
self.y1 = y1
self.y2 = y2
>>> asizeof.asizeof(Rect2(0, 0, 0, 0))
<<< 184
Tuple vs List
• Tuple более экономичен (буфер фиксированного
размера)

• Immutable tuple может быть оптимизирован python

• tuple - отличный аналог структур в других языках
Tuple Rect
rect = (0,0,0,0)
>>> asizeof.asizeof(rect)
<<< 104
Named Tuple
import collections
Rect = collections.namedtuple('Rect', 'x1 x2 x3 x4')
>>> asizeof.asizeof(Rect(0,0,0,0))
<<< 160
Полезные хитрости
Работа с большим
байтовым массивом
• При традиционной работе (bytes) - много копирований
- большое потребление памяти

• Выход есть - memoryview:

• «Специальный объект, предназначенный для
работы с внутренними данными (байтами) без их
копирования»
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)
Интернирование строк
• При анализе .py файла интерпретатор, встречая
одинаковые строки, вставляет ссылку на один и тот
же объект в памяти

• Этот механизм легко сломать
a = "abcdefhijkabcdefhijkabcdefhijkabcdefhijk"
b = "abcdefhijkabcdefhijkabcdefhijkabcdefhijk"
>>> id(a) == id(b)
<<< True
a = "a" * 40
b = "a" * 40
>>> id(a) == id(b)
<<< False
Числа от -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
Format
def __str__(self):
return self.city + " " + self.street + 
" " + self.house + " " + self.flat
VS
def __str__(self):
return "{} {} {} {}".format(
self.city, self.street, self.house, self.flat
)
Спасибо за
внимание
Полезная литература
• https://hbfs.wordpress.com/2013/01/08/python-memory-management-part-ii/

• https://hbfs.wordpress.com/2013/01/01/python-memory-management-part-i/

• http://datos.io/python-memory-issues-tips-and-tricks/

• https://wiki.python.org/moin/PythonSpeed/PerformanceTips

• https://dzone.com/articles/python-memory-issues-tips-and-tricks

• https://stackoverflow.com/questions/3021264/python-tips-for-memory-optimization

• https://www.qtrac.eu/pysavemem.html

• https://hbfs.wordpress.com/2009/11/10/is-python-slow/

• https://hbfs.wordpress.com/2010/06/08/is-python-slow-part-ii/

• https://hbfs.wordpress.com/2011/09/13/run-python-run/

• https://hbfs.wordpress.com/2011/06/14/python-references-vs-c-and-c/

• http://deeplearning.net/software/theano/tutorial/python-memory-management.html

More Related Content

PDF
Мир Python функционалим с помощью библиотек
PDF
Python&Printer / Андрей Пучко / penta.by
PPT
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
PDF
Игорь Лабутин «Коллекционируем данные в .NET»
PPTX
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
PDF
Магия в Python: Дескрипторы. Что это?
PDF
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
PDF
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Мир Python функционалим с помощью библиотек
Python&Printer / Андрей Пучко / penta.by
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Игорь Лабутин «Коллекционируем данные в .NET»
Python AST / Николай Карелин / VPI Development Center [Python Meetup 27.03.15]
Магия в Python: Дескрипторы. Что это?
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
20130429 dynamic c_c++_program_analysis-alexey_samsonov

What's hot (20)

PDF
Лекция 6. Стандарт OpenMP
PDF
Сверхоптимизация кода на Python
PDF
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
PDF
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
PDF
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
PDF
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
PDF
Введение в потоки питона
PDF
Pyton – пробуем функциональный стиль
PDF
Лекция 4: Стек. Очередь
PDF
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
PDF
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PPTX
Михаил Матросов, “С++ без new и delete”
PDF
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
PDF
Поговорим о микрооптимизациях .NET-приложений
PDF
Продолжаем говорить о микрооптимизациях .NET-приложений
PDF
Лекция 6. Стандарт OpenMP
PDF
Лекция 8. Intel Threading Building Blocks
PDF
Красота и изящность стандартной библиотеки Python
PDF
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Лекция 6. Стандарт OpenMP
Сверхоптимизация кода на Python
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»
Введение в потоки питона
Pyton – пробуем функциональный стиль
Лекция 4: Стек. Очередь
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Михаил Матросов, “С++ без new и delete”
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Поговорим о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
Лекция 6. Стандарт OpenMP
Лекция 8. Intel Threading Building Blocks
Красота и изящность стандартной библиотеки Python
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Ad

Similar to «Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС (10)

PDF
Python и его тормоза
PDF
Python и Cython
PDF
На что уходит память - Константин Лопухин, PyCon RU 2014
PDF
Беглый обзор "внутренностей" Python
PDF
Беглый обзор "внутренностей" Python
PDF
Python dict: прошлое, настоящее, будущее
PDF
Kranonit s16 (python). sergey burma
ODP
About Python
PDF
Python и высокая нагрузка
PPTX
Управление памятью в CPython
Python и его тормоза
Python и Cython
На что уходит память - Константин Лопухин, PyCon RU 2014
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
Python dict: прошлое, настоящее, будущее
Kranonit s16 (python). sergey burma
About Python
Python и высокая нагрузка
Управление памятью в CPython
Ad

More from it-people (20)

PDF
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
PDF
«Scrapy internals» Александр Сибиряков, Scrapinghub
PDF
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
PDF
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
PDF
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
PDF
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
PDF
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
PDF
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
PDF
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
PDF
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
PDF
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
PDF
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
PDF
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
PDF
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
PDF
«(Без)опасный Python», Иван Цыганов, Positive Technologies
PDF
«Python of Things», Кирилл Борисов, Яндекс
PDF
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
PDF
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
PDF
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
PDF
ЗАВИСИМОСТИ В КОМПОНЕНТНОМ ВЕБЕ, ПРИГОТОВЛЕННЫЕ ПРАВИЛЬНО, Гриненко Владимир,...
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«Python of Things», Кирилл Борисов, Яндекс
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
ЗАВИСИМОСТИ В КОМПОНЕНТНОМ ВЕБЕ, ПРИГОТОВЛЕННЫЕ ПРАВИЛЬНО, Гриненко Владимир,...

«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС

  • 2. Память и Python Что надо знать для счастья? Кузьмин Алексей
  • 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 тактов / десятки штук
  • 7. Проблемы с памятью • SWAP • Повышенное использование • Утечки • Out of memory
  • 9. Python class Address: def __init__(self, city=None, street=None, house=None, flat=None): self.city = city self.street = street self.house = house self.flat = flat a = Address( city="Moscow", street="3-ya ulitsa stroiteley", house="25", flat="12" )
  • 11. Objgraph • Визуализация объектов (и ссылок) • Учет объектов • Помощь в поиске утечек
  • 12. Память • Как узнать сколько памяти потребляет отдельный объект? • Решение из стандартной библиотеки: import sys sys.getsizeof([1,2,3]) • Показывает shallow-size
  • 13. PYMPLER • asizeof - измерение размера (deep-size) • tracker - информация об общем потреблении памяти (ищем утечки) • classtracker - информация об измении потреблеия памяти в течении жизни объекта
  • 14. PYMPLER >>> asizeof.asizeof(None) <<< 16 >>> asizeof.asizeof(3) <<< 32 >>> asizeof.asizeof(3.14) <<< 24 >>> asizeof.asizeof([]) <<< 64 >>> asizeof.asizeof({}) <<< 288 >>> asizeof.asizeof(tuple()) <<< 48
  • 15. PyObject Счетчик ссылок Информация о типе Данные GarbageCollector’а (не всегда) Ваши данные
  • 16. Python • Потребление памяти «снаружи» и «внутри» - два разных потребления памяти :-) • Python не возвращает память в операционную систему • Она хранится выделенной для использования под новые объекты
  • 19. Механизмы освобождения памяти • Garbage Collector a = [] b = [] a.append(b) b.append(a)
  • 20. А есть ли проблема?
  • 21. Общее потребление • «Диспетчер задач» • htop • docker stats • …
  • 22. Конкретные функции • memory_profiler $ python -m memory_profiler mem_test.py Filename: mem_test.py Line # Mem usage Increment Line Contents ================================================ 3 45.930 MiB 0.000 MiB @profile 4 def function(): 5 84.559 MiB 38.629 MiB x=list(range(1000000)) 6 92.008 MiB 7.449 MiB y=copy.deepcopy(x) 7 92.008 MiB 0.000 MiB return y
  • 23. mprof • Потребление в течении времени $ mprof run mem_test.py $ mprof plot
  • 24. Анализ объектов from pympler import muppy from pympler import summary all_objects1 = muppy.get_objects() data = list(range(1000)) all_objects2 = muppy.get_objects() sum1 = summary.summarize(all_objects1) sum2 = summary.summarize(all_objects2) summary.print_(summary.get_diff(sum1, sum2)) $ python mem_test.py types | # objects | total size ============ | =========== | ============ <class 'list | 2 | 287.59 KB <class 'int | 823 | 22.50 KB
  • 26. Rect class Rect1: def __init__(self, x1, y1, x2, y2): self.x1 = x1 self.x2 = x2 self.y1 = y1 self.y2 = y2 >>> asizeof.asizeof(Rect1(0, 0, 0, 0)) <<< 496
  • 27. SLOTS • Ускорение доступа к атрибутам • Сокращение используемой памяти class Foo(object): __slots__ = 'bar', 'baz'
  • 28. Slots Rect class Rect2: __slots__ = ("x1", "x2", "y1", "y2") def __init__(self, x1, y1, x2, y2): self.x1 = x1 self.x2 = x2 self.y1 = y1 self.y2 = y2 >>> asizeof.asizeof(Rect2(0, 0, 0, 0)) <<< 184
  • 29. Tuple vs List • Tuple более экономичен (буфер фиксированного размера) • Immutable tuple может быть оптимизирован python • tuple - отличный аналог структур в других языках
  • 30. Tuple Rect rect = (0,0,0,0) >>> asizeof.asizeof(rect) <<< 104
  • 31. Named Tuple import collections Rect = collections.namedtuple('Rect', 'x1 x2 x3 x4') >>> asizeof.asizeof(Rect(0,0,0,0)) <<< 160
  • 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
  • 37. Format def __str__(self): return self.city + " " + self.street + " " + self.house + " " + self.flat VS def __str__(self): return "{} {} {} {}".format( self.city, self.street, self.house, self.flat )
  • 39. Полезная литература • https://hbfs.wordpress.com/2013/01/08/python-memory-management-part-ii/ • https://hbfs.wordpress.com/2013/01/01/python-memory-management-part-i/ • http://datos.io/python-memory-issues-tips-and-tricks/ • https://wiki.python.org/moin/PythonSpeed/PerformanceTips • https://dzone.com/articles/python-memory-issues-tips-and-tricks • https://stackoverflow.com/questions/3021264/python-tips-for-memory-optimization • https://www.qtrac.eu/pysavemem.html • https://hbfs.wordpress.com/2009/11/10/is-python-slow/ • https://hbfs.wordpress.com/2010/06/08/is-python-slow-part-ii/ • https://hbfs.wordpress.com/2011/09/13/run-python-run/ • https://hbfs.wordpress.com/2011/06/14/python-references-vs-c-and-c/ • http://deeplearning.net/software/theano/tutorial/python-memory-management.html