Skip to content

Instantly share code, notes, and snippets.

@lazarofl
Created July 26, 2024 19:13
Show Gist options
  • Save lazarofl/6e0f5a9021cd55c3e11cc245530111e4 to your computer and use it in GitHub Desktop.
Save lazarofl/6e0f5a9021cd55c3e11cc245530111e4 to your computer and use it in GitHub Desktop.
Python function to get object size
import sys
from django.http import HttpRequest
from waffle.models import Flag, Switch
from waffle import flag_is_active, switch_is_active
from django.contrib.auth.models import User
def get_size(obj, seen=None):
"""Recursively find the size of an object."""
size = sys.getsizeof(obj)
if seen is None:
seen = set()
obj_id = id(obj)
if obj_id in seen:
return 0
seen.add(obj_id)
if isinstance(obj, dict):
size += sum([get_size(v, seen) for v in obj.values()])
size += sum([get_size(k, seen) for k in obj.keys()])
elif hasattr(obj, '__dict__'):
size += get_size(obj.__dict__, seen)
elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
size += sum([get_size(i, seen) for i in obj])
return size
# Create a sample user
user = User(username='test_user')
user.save()
# Create sample Waffle switch
switch = Switch.objects.create(name='test_switch', active=True)
# Create sample Waffle flag
flag = Flag.objects.create(name='test_flag', everyone=True)
# Create a HttpRequest object and associate the user with it
request = HttpRequest()
request.user = user
# Check the flag and switch status to ensure they are cached
is_flag_active = flag_is_active(request, 'test_flag')
is_switch_active = switch_is_active('test_switch')
# Measure the size of the flag and switch objects
flag_size = get_size(flag)
switch_size = get_size(switch)
# Output the sizes
print(f"Size of Waffle Flag object: {flag_size} bytes")
print(f"Size of Waffle Switch object: {switch_size} bytes")
# Clean up the created entries
user.delete()
flag.delete()
switch.delete()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment