Python Memory Management
Understand Python memory management and optimization.
Manage memory efficiently.
Check Memory Usage
```python import sys
x = [1, 2, 3, 4, 5] print(sys.getsizeof(x)) # bytes
Compare y = (1, 2, 3, 4, 5) print(sys.getsizeof(y)) # Tuples smaller ```
Garbage Collection
```python import gc
Check if enabled print(gc.isenabled()) # True
Disable (careful!) gc.disable()
Enable gc.enable()
Force collection gc.collect() ```
Weak References
```python import weakref
class Data: def __init__(self, value): self.value = value
obj = Data(42) weak_ref = weakref.ref(obj)
print(weak_ref().value) # 42
del obj print(weak_ref()) # None (garbage collected) ```
__slots__ for Memory Saving
```python class Person: __slots__ = ['name', 'age'] def __init__(self, name, age): self.name = name self.age = age
Uses less memory than regular class person = Person("Tom", 25) ```
Memory Profiling
```python from memory_profiler import profile
@profile def memory_heavy(): data = [i ** 2 for i in range(1000000)] return sum(data)
memory_heavy() ```
Generator for Memory
```python # Bad - loads all in memory def get_numbers(): return [i for i in range(1000000)]
Good - one at a time def get_numbers_gen(): for i in range(1000000): yield i ```
Remember
- Python handles memory automatically - Use generators for large datasets - __slots__ reduces memory usage - Weak references prevent memory leaks