Optimizing Memory Usage in Python with Slots

Optimizing Memory Usage in Python with Slots

In Python, objects can store their attributes in a flexible dictionary-like structure that can use a lot of memory. However, using slots can make your objects more memory-efficient by reserving space for their attributes ahead of time.

Without Slots

Let’s consider an example without using slots:

from random import randint
from memory_profiler import profile

class Dog:
    def __init__(self, age):
        self.age = age

@profile
def main():
    return [Dog(age=randint(0, 30)) for _ in range(100000)]

if __name__ == "__main__":
    main()

To run this code and profile its memory usage, save it to a file named without_slot.py and run it with the following command:

python -m memory_profiler without_slot.py

Running this code with the memory_profiler module shows that it uses approximately 57.8 MiB of memory.

With Slots

Now, let’s modify the code to use slots:

from random import randint
from memory_profiler import profile

class Dog:
    # defining slots
    __slots__ = ["age"] 
    def __init__(self, age):
        self.age = age

@profile
def main():
    return [Dog(age=randint(0, 30)) for _ in range(100000)]

if __name__ == "__main__":
    main()

To run this code and profile its memory usage, save it to a file named with_slot.py and run it with the following command:

python -m memory_profiler with_slot.py

Running this code with the memory_profiler module shows that it uses approximately 46.7 MiB of memory.

Comparison

By using slots, we have reduced memory usage by about 11.1 MiB. This is a significant reduction in memory usage, especially when dealing with large objects or a large number of objects.

Advantages of Using Slots

Using slots has several advantages:

  • Memory Efficiency: Slots make your objects more memory-efficient by reserving space for their attributes ahead of time.
  • Faster Attribute Access: Slots can also make attribute access faster since Python doesn’t have to perform a dictionary lookup.
  • Prevention of Typos: By defining slots, you can prevent typos in attribute names since Python will raise an AttributeError if you try to access an attribute that is not defined in the slots.

Conclusion

In conclusion, using slots in Python can significantly reduce memory usage and improve performance. By defining slots, you can make your objects more memory-efficient, access attributes faster, and prevent typos in attribute names. Therefore, it’s a good practice to use slots when dealing with large objects or a large number of objects.

Search

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

Work with Khuyen Tran

Work with Khuyen Tran