Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

505 views

Published on

Выступление на PYCON RUSSIA 2017

Published in: Internet
  • Be the first to comment

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

  1. 1. Память и Python Что надо знать для счастья? Кузьмин Алексей
  2. 2. Коротко обо мне • Технический руководитель группы SmartData в Центр Недвижимости от Сбербанка • Python • Machine Learning & Data Science • C++
  3. 3. О докладе • Для кого: • Junior, middle python developer - узнать новое • Senior python - освежить знания
  4. 4. О докладе • Вы узнаете: • Почему память это важно • Как узнать её потребление вашей программой • Почему её потребляется так много • Как снизить потребление памяти
  5. 5. Иерархия памяти Жесткий диск 10 000 000 тактов / 1000 GB Оперативная память 200 тактов / 8 GB L1 - L3 кеши 4-50 тактов / 32 KB - 8 MB Регистры 0 тактов / десятки штук
  6. 6. Проблемы с памятью • SWAP • Повышенное использование • Утечки • Out of memory
  7. 7. Python и память
  8. 8. 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" )
  9. 9. Objects
  10. 10. Objgraph • Визуализация объектов (и ссылок) • Учет объектов • Помощь в поиске утечек
  11. 11. Память • Как узнать сколько памяти потребляет отдельный объект? • Решение из стандартной библиотеки: import sys sys.getsizeof([1,2,3]) • Показывает shallow-size
  12. 12. PYMPLER • asizeof - измерение размера (deep-size) • tracker - информация об общем потреблении памяти (ищем утечки) • classtracker - информация об измении потреблеия памяти в течении жизни объекта
  13. 13. PYMPLER >>> asizeof.asizeof(None) <<< 16 >>> asizeof.asizeof(3) <<< 32 >>> asizeof.asizeof(3.14) <<< 24 >>> asizeof.asizeof([]) <<< 64 >>> asizeof.asizeof({}) <<< 288 >>> asizeof.asizeof(tuple()) <<< 48
  14. 14. PyObject Счетчик ссылок Информация о типе Данные GarbageCollector’а (не всегда) Ваши данные
  15. 15. Python • Потребление памяти «снаружи» и «внутри» - два разных потребления памяти :-) • Python не возвращает память в операционную систему • Она хранится выделенной для использования под новые объекты
  16. 16. PYMALLOC
  17. 17. Механизмы освобождения памяти • Счетчик ссылок
  18. 18. Механизмы освобождения памяти • Garbage Collector a = [] b = [] a.append(b) b.append(a)
  19. 19. А есть ли проблема?
  20. 20. Общее потребление • «Диспетчер задач» • htop • docker stats • …
  21. 21. Конкретные функции • 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
  22. 22. mprof • Потребление в течении времени $ mprof run mem_test.py $ mprof plot
  23. 23. Анализ объектов 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
  24. 24. Немного практики
  25. 25. 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
  26. 26. SLOTS • Ускорение доступа к атрибутам • Сокращение используемой памяти class Foo(object): __slots__ = 'bar', 'baz'
  27. 27. 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
  28. 28. Tuple vs List • Tuple более экономичен (буфер фиксированного размера) • Immutable tuple может быть оптимизирован python • tuple - отличный аналог структур в других языках
  29. 29. Tuple Rect rect = (0,0,0,0) >>> asizeof.asizeof(rect) <<< 104
  30. 30. Named Tuple import collections Rect = collections.namedtuple('Rect', 'x1 x2 x3 x4') >>> asizeof.asizeof(Rect(0,0,0,0)) <<< 160
  31. 31. Полезные хитрости
  32. 32. Работа с большим байтовым массивом • При традиционной работе (bytes) - много копирований - большое потребление памяти • Выход есть - memoryview: • «Специальный объект, предназначенный для работы с внутренними данными (байтами) без их копирования»
  33. 33. 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)
  34. 34. Интернирование строк • При анализе .py файла интерпретатор, встречая одинаковые строки, вставляет ссылку на один и тот же объект в памяти • Этот механизм легко сломать a = "abcdefhijkabcdefhijkabcdefhijkabcdefhijk" b = "abcdefhijkabcdefhijkabcdefhijkabcdefhijk" >>> id(a) == id(b) <<< True a = "a" * 40 b = "a" * 40 >>> id(a) == id(b) <<< False
  35. 35. Числа от -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
  36. 36. 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 )
  37. 37. Спасибо за внимание
  38. 38. Полезная литература • 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

×