Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nina Zakharenko - Memory Management in Python -...

Nina Zakharenko - Memory Management in Python - The Basics

As a new python developer, do you find memory management in Python confusing? Come to this talk to learn about the basics of how Memory Management works in Python. We'll cover the concepts of reference counting, garbage collection, weak references, __slots__, and the Global Interpreter Lock.

https://us.pycon.org/2016/schedule/presentation/2251/

PyCon 2016

May 29, 2016
Tweet

More Decks by PyCon 2016

Other Decks in Programming

Transcript

  1. What’s a C-style variable? Memory variable location Value a 0x3E8

    101 b 0x3E9 101 These values live in a fixed size bucket. Can only hold same-sized data, or an overflow occurs.
  2. What’s a C-style variable? Memory location Value 0x3E8 101 0x3E9

    101 Later… 110 The data in this memory location is overwritten.
  3. A name is just a label for an object. In

    python, each object can have lots of names.
  4. How can we increase the ref count? 300 x =

    300 y = 300 x references: 2 y +1
  5. How can we increase the ref count? 300 z =

    [300, 300] x references: 4 y
  6. Decrease Ref Count - del 300 x = 300 y

    = 300 del x references: 1 y x
  7. What does del do? The del statement doesn’t delete objects.

    It: • removes that name as a reference to that object • reduces the ref count by 1
  8. Decrease Ref Count - Change Reference x = 300 y

    = 300 300 references:0 y y = None
  9. Decrease Ref Count - Going out of Scope def print_word():

    word = 'Seven' print('Word is ' + word) ref count +1 ‘seven’ is out of scope. ref count -1 print_word()
  10. local vs. global namespace ▪If refcounts decrease when an object

    goes out of scope, what happens to objects in the global namespace? ▪Never go out of scope! Refcount never reaches 0. ▪Avoid putting large or complex objects in the global namespace.
  11. x = 300 y = 300 print( id(x) ) >

    28501818 print( id(y) ) > 28501818 print x is y > True * don’t try this in an interactive environment (REPL)
  12. What is Garbage Collection? A way for a program to

    automatically release memory when the object taking up that space is no longer in use.
  13. How does reference counting garbage collection work? Add and Remove

    References Refcount Reaches 0 Cascading Effect
  14. The Good • Easy to Implement • When refcount is

    0, objects are immediately deleted. Reference Counting Garbage Collection The Bad • space overhead - reference count is stored for every object • execution overhead - reference count changed on every assignment
  15. The Ugly • Not generally thread safe • Reference counting

    doesn’t detect cyclical references Reference Counting Garbage Collection
  16. What’s a cyclical reference? left right root rc = 1

    rc = 3 rc = 2 root = Node('root') left = Node('left') right = Node(‘right') root.next(left) left.next(right) right.next(left)
  17. Generational Garbage Collection is based on the theory that most

    objects die young. ▪ source: http://cs.ucsb.edu/~ckrintz/racelab/gc/papers/hoelzle-jvm98.pdf
  18. Python maintains a list of every object created as a

    program is run. Actually, it makes 3. generation 0 generation 1 generation 2 Newly created objects are stored in generation 0.
  19. When the number of objects in a generation reaches a

    threshold, python runs a garbage collection algorithm on that generation, and any generations younger than it.
  20. What happens during a generational garbage collection cycle? Python makes

    a list for objects to discard. It runs an algorithm to detect reference cycles. If an object has no outside references, it’s put on the discard list. When the cycle is done, it frees up the objects on the discard list.
  21. After a garbage collection cycle, objects that survived will be

    promoted to the next generation. Objects in the last generation (2) stay there as the program executes.
  22. When the ref count reaches 0, you get immediate clean

    up. If you have a cycle, you need to wait for garbage collection.
  23. Remember our cycle from before? left right rc = 1

    rc = 1 Cyclical references get cleaned up by generational garbage collection.
  24. Cyclical Reference Cleanup Except in python2 if they have a

    __del__ method. **fixed in python 3.4! - https://www.python.org/dev/peps/pep-0442/ Gotcha!
  25. The __del__ magic method ▪ Sometimes called a “destructor” ▪Not

    the del statement. ▪ Runs before an object is removed from memory
  26. What are __slots__? class Dog(object): pass buddy = Dog() buddy.name

    = 'Buddy' print(buddy.__dict__) {'name': 'Buddy'}
  27. What are __slots__? 'Pug'.name = 'Fred' AttributeError Traceback (most recent

    call last) ----> 1 'Pug'.name = 'Fred' AttributeError: 'str' object has no attribute 'name'
  28. class Point(object): __slots__ = ('x', 'y') What are __slots__? What

    is the type of __slots__? point.name = "Fred" Traceback (most recent call last): File "point.py", line 8, in <module> point.name = "Fred" AttributeError: 'Point' object has no attribute 'name' point = Point() point.x = 5 point.y = 7
  29. size of dict vs. size of tuple import sys sys.getsizeof(dict())

    sys.getsizeof(tuple()) sizeof dict: 288 bytes sizeof tuple: 48 bytes
  30. When would we want to use __slots__? ▪ If we’re

    going to be creating many instances of a class ▪If we know in advance what properties the class should have
  31. Upside Fast & Simple Garbage Collection Advantages / Disadvantages of

    a GIL Downside In a python program, no matter how many threads exist, only one thread will be executed at a time.
  32. ▪Use multi-processing instead of multi- threading. ▪Each process will have

    it’s own GIL, it’s on the developer to figure out a way to share information between processes. Want to take advantage of multiple CPUs?
  33. If the GIL limits us, can’t we just remove it?

    additional reading: https://docs.python.org/3/faq/library.html#can-t-we-get-rid-of-the-global-interpreter-lock
  34. Additional Reading • Great explanation of generational garbage collection and

    python’s reference detection algorithm. • https://www.quora.com/How-does-garbage-collection-in-Python- work • Weak Reference Documentation • https://docs.python.org/3/library/weakref.html • Python Module of the Week - gc • https://pymotw.com/2/gc/ • PyPy STM - GIL less Python Interpreter • http://morepypy.blogspot.com/2015/03/pypy-stm-251- released.html • Saving 9GB of RAM with python’s __slots__ • http://tech.oyster.com/save-ram-with-python-slots/
  35. Getting in-depth with the GIL • Dave Beazley - Guide

    on how the GIL Operates • http://www.dabeaz.com/python/GIL.pdf • Dave Beazley - New GIL in Python 3.2 • http://www.dabeaz.com/python/NewGIL.pdf • Dave Beazley - Inside Look at Infamous GIL Patch • http://dabeaz.blogspot.com/2011/08/inside-look-at-gil- removal-patch-of.html
  36. Why can’t we use the REPL to follow along at

    home? • Because It doesn’t behave like a typical python program that’s being executed. • Further reading: http:/ /stackoverflow.com/questions/ 25281892/weird-id-result-on-cpython-intobject PYTHON PRE-LOADS OBJECTS • Many objects are loaded by Python as the interpreter starts. • Called peephole optimization. • Numbers: -5 -> 256 • Single Letter Strings • Common Exceptions • Further reading: http:/ /akaptur.com/blog/2014/08/02/ the-cpython-peephole-optimizer-and-you/
  37. Common Question - Why doesn’t python a python program shrink

    in memory after garbage collection? • The freed memory is fragmented. • i.e. It’s not freed in one continuous block. • When we say memory is freed during garbage collection, it’s released back to python to use for other objects, and not necessarily to the system. • After garbage collection, the size of the python program likely won’t go down.
  38. PyListObject type list refcount 1 value size 3 capacity 10

    nums Value -10 refcount 1 type integer PyObject Value -9 refcount 2 type integer PyObject How does python store container objects?
  39. Credits Big thanks to: • Faris Chebib & The Salt

    Lake City Python Meetup • The many friends & co-workers who lent me their eyes & ears, particularly Steve Holden Special thanks to all the people who made and released these awesome resources for free: ▪ Presentation template by SlidesCarnival ▪ Photographs by Unsplash ▪ Icons by iconsdb