Dec-15-2020, 02:45 PM
I'm trying to measure the size of my recursively defined data structures, but I'm getting wildly large results.
Perhaps it's the tool that I'm using rememberme.memory(). I chose this because sys.getsizeof() does not work on recursively defined structures.
I estimate that the max size of the BST presented should be around 512 bytes plus a bit for python's overhead if any, but I'm getting results 16 times larger.
Is rememberme.memory() the correct tool for this job?
Perhaps it's the tool that I'm using rememberme.memory(). I chose this because sys.getsizeof() does not work on recursively defined structures.
I estimate that the max size of the BST presented should be around 512 bytes plus a bit for python's overhead if any, but I'm getting results 16 times larger.
Is rememberme.memory() the correct tool for this job?
class Node:
def __init__(self, data):
self.data = data
self.next = None
self.previous = None
def has_next(self):
if self.next != None:
return True
else:
return False
def has_previous(self):
if self.previous != None:
return True
else:
return False
def __str__(self):
result = ""
if self.previous != None:
result += str(self.previous) + " "
result += str(self.data)
if self.next != None:
result += " " + str(self.next)
return result
class BST:
def __init__(self):
self.root = None
def add(self, data):
if self.root == None:
self.root = Node(data)
else:
current_node = self.root
while current_node != None:
current_node = self.add_h(current_node, data)
def add_h(self, node, data):
if data > node.data:
if node.next == None:
node.next = Node(data)
print('leaf node:', memory(node.next))
else:
return node.next
if data < node.data:
if node.previous == None:
node.previous = Node(data)
print('leaf node:', memory(node.previous))
else:
return node.previous
def __str__(self):
return str(self.root)
from rememberme import memory
from sys import getsizeof
print('BST')
bst = BST()
print('BST, rememberme', memory(bst), 'bytes')
print('BST getsizeof', getsizeof(bst), 'bytes')
bst.add(7)
print('BST, rememberme', memory(bst), 'bytes')
print('BST getsizeof', getsizeof(bst), 'bytes')
print('values:', bst)
bst.add(3)
print('BST, rememberme', memory(bst), 'bytes')
print('BST getsizeof', getsizeof(bst), 'bytes')
print('values:', bst)
bst.add(4)
print('BST, rememberme', memory(bst), 'bytes')
print('BST getsizeof', getsizeof(bst), 'bytes')
print('values:', bst)
bst.add(9)
print('BST, rememberme', memory(bst), 'bytes')
print('BST getsizeof', getsizeof(bst), 'bytes')
print('values:', bst)
print('\nList')
v_list = [3, 4, 7, 9]
print('rememberme', memory(v_list), 'bytes')
print('getsizeof', getsizeof(v_list), 'bytes')
print('values:', v_list)
print('\nDictionary')
v_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print('rememberme', memory(v_dict), 'bytes')
print('getsizeof', getsizeof(v_dict), 'bytes')
print('values:', v_dict)Here are the results:Output:BST
BST, rememberme 3991 bytes
BST getsizeof 48 bytes
BST, rememberme 7444 bytes
BST getsizeof 48 bytes
values: 7
leaf node: 4047
BST, rememberme 7624 bytes
BST getsizeof 48 bytes
values: 3 7
leaf node: 4047
BST, rememberme 7804 bytes
BST getsizeof 48 bytes
values: 3 4 7
leaf node: 4047
BST, rememberme 7984 bytes
BST getsizeof 48 bytes
values: 3 4 7 9
List
rememberme 232 bytes
getsizeof 120 bytes
values: [3, 4, 7, 9]
Dictionary
rememberme 344 bytes
getsizeof 232 bytes
values: {'a': 1, 'b': 2, 'c': 3, 'd': 4}I just don't understand how a 4 node BST can be nearly 8kb.
