Я пишу игру, в которой есть юниты. Есть класс Unit, который представляет собой хранилище информации о каждом отдельном юните. У класса Unit сейчас такая структура:
class Unit:
def __init__(self, color, health):
self.color = color
self.health = health
При создании юнита я каждый раз создаю экземпляр класса Unit, чтобы потом с легкостью в нужном мне месте получить нужную информацию о любом юните. Значит, если у меня на поле 100 одинаковых юнитов, то одна и та же информация хранится в памяти в 100 экземплярах?
Так как в игре у меня обычно много юнитов, а у каждого юнита по 23 свойства, я подумал, что будет лучше оптимизировать вот так:
class Unit:
color = (13, 155, 250)
health = 100
def __init__(self):
#Do something
pass
Во втором примере кода одна и та же информация не хранится в памяти много раз, как я думаю, так как color и health это уже не свойства юнитов, которых сотни, а свойства класса, а класс у нас только один.
Я решил проверить, поможет ли этот способ оптимизировать использование памяти и воспользовался библиотекой
guppy3
Сначала я проверил, сколько памяти занимают 10000 юнитов, если использовать первый (неоптимизированный) способ:
from guppy import hpy
'''
Массив со списком всех юнитов, чтобы объекты не уничтожались
из-за того, что на них ничего не ссылается
'''
l = list()
class Unit:
def __init__(self, number, radius, width, color):
self.number = number
self.radius = radius
self.width = width
self.color = color
l.append(self)
for i in range(10000):
''' Создание 10000 юнитов '''
Unit(i, 4, 1, (13, 150, 255))
h = hpy()
''' Вывод информации о том, сколько места в памяти занимает программа '''
print(h.heap())
В итоге, если верить данным, которые выдает библиотека guppy3, моя программа заняла 5,8 МБ в памяти
Теперь проверим, сколько памяти займет программа, если использовать второй (оптимизированный) способ:
from guppy import hpy
'''
Массив со списком всех юнитов, чтобы объекты не уничтожались
из-за того, что на них ничего не ссылается
'''
l = list()
class Unit:
radius = 4
width = 1
color = (13, 150, 255)
def __init__(self, number):
self.number = number
l.append(self)
for i in range(10000):
''' Создание 10000 юнитов '''
Unit(i)
h = hpy()
''' Вывод информации о том, сколько места в памяти занимает программа '''
print(h.heap())
В итоге выходит, что вторая программа занимает в памяти почти точь в точь столько же места - 5,8 МБ.
Почему никакой разницы нет? Может "под капотом" python сам оптимизирует это, поэтому результат одинаковый? Или, наоборот, и там, и там одна и та же информация повторяется 10000 раз и нужно искать другой способ исправить это?