На самом деле вашей программе нужно как минимум (!) 300 * 300 * 300 * 4 * 3 байта исключительно для значений данных из dicts. Кроме того, ваши кортежи ключей занимают 300 * 300 * 300 * 3 * 3 * 4 байта.
Это всего 1296000000 байт или 1,2 ГиБ данных.
Этот расчет даже не включает накладные расходы на поддержание данных в диктовке.
Таким образом, это зависит от количества памяти, которое имеет ваша машина, если она выходит из строя или нет.
Вы могли бы сделать первый шаг и сделать
s = {}
ns = {}
ts = {}
for i in range(0, 300):
for j in range(0, 300):
for k in range(0, 300):
index=(i, j, k)
s[index]=j
ns[index]=k
ts[index]=i*j*k
, который (в теории) будет занимать только половину памяти, как и прежде, а также только для данных, так как кортежи индекса используются повторно.
Из того, что вы описываете (вам нужен простой подсчет), вам не нужно предварительно инициализировать полный диапазон комбинаций. Таким образом, вы можете опустить вашу инициализацию, показанную в вопросе, и вместо этого создать хранилище, где вы храните эти значения только там, где у вас действительно есть данные, которых, предположительно, гораздо меньше, чем возможно.
Вы можете либо использовать defaultdict()
, либо подражать его поведению вручную, так как я думаю, что большинство комбинаций не используются в вашей цветовой «палитре».
from collections import defaultdict
make0 = lambda: 0
s = defaultdict(make0)
ns = defaultdict(make0)
# what is ts? do you need it?
Теперь у вас есть три dict
-подобных объекта, которые могут быть записаны в случае необходимости. Затем для каждой комбинации цветов, которые у вас действительно есть, вы можете сделать s[index] += 1
соотв. ns[index] += 1
.
Я не знаю о вашем ts
- возможно, вы либо сможете рассчитать его, либо вам придется найти другое решение.