有没有一种方法可以在 python 中使用更少的内存来做到这一点
Is there a way that uses less memory in python to do this
我正在使用 or-tools 来解决优化问题。我有很多限制条件存储在列表中。不幸的是,这会占用大量内存 space.
constraints_list = []
for i in range(rows):
constraints_list.append([0] * (4 * i) + [1, 1, 1, 1] + [0] * ((rows * (columns - 1)) - ((columns - 1) * (i + 1))))
rows
是几十万的数量级,columns
是五。有更好的方法吗?
我首先想到的是使用某种压缩。即仅将约束的重要部分存储在重现整个约束所需的数组中。例如:
[0] * (4 * i)
这不是完全需要的。您可以简单地存储 i
并且您将知道此数组中的第一个 4 * 1
元素将为 0。同样,
+[1, 1, 1, 1]
不需要,因为您已经知道在第一个 4 * i
元素之后,接下来的四个将为 1。再次
+[0] * ((rows * (columns - 1)) - ((columns - 1) * (i + 1))))
也没有必要。您可以简单地存储值 x = ((rows * (columns - 1)) - ((columns - 1) * (i + 1)))
并且您知道最后的 x
元素也将为 0。
总体而言,您的代码如下所示:
constraints_list = []
for i in range(rows):
x = (rows * (columns - 1)) - (columns - 1) * (i + 1)
new_constraint = [i, x]
constraints_list.append(new_constraint)
请注意,每个 new_constraint
的解压缩仍然是不变的,即使使用这个压缩版本,在每个索引处找到一个元素也相当容易。另外,请注意 (rows * (columns - 1)) - (columns - 1) * (i + 1)
中唯一的变量是 i+1
。因此,与其说 x = (rows * (columns - 1)) - (columns - 1) * (i + 1)
,不如说 x = i+1
是绝对必要的,尽管不压缩它可能会更容易。
编辑:我意识到在您的特定 constraints_list
中,绝对没有必要实际存储任何存储空间。您可以简单地拥有一个将 i
、rows
和 columns
作为参数的 build_constraint
函数。一个例子可以是:
def build_constraint(i, rows, columns):
return [0] * (4 * i) + [1, 1, 1, 1] + [0] * ((rows * (columns - 1)) - ((columns - 1) * (i + 1)))
但是,我确实意识到这可能会很不方便,具体取决于您的具体目的,但这是一种选择。它在建立约束方面也不是特别慢。
我正在使用 or-tools 来解决优化问题。我有很多限制条件存储在列表中。不幸的是,这会占用大量内存 space.
constraints_list = []
for i in range(rows):
constraints_list.append([0] * (4 * i) + [1, 1, 1, 1] + [0] * ((rows * (columns - 1)) - ((columns - 1) * (i + 1))))
rows
是几十万的数量级,columns
是五。有更好的方法吗?
我首先想到的是使用某种压缩。即仅将约束的重要部分存储在重现整个约束所需的数组中。例如:
[0] * (4 * i)
这不是完全需要的。您可以简单地存储 i
并且您将知道此数组中的第一个 4 * 1
元素将为 0。同样,
+[1, 1, 1, 1]
不需要,因为您已经知道在第一个 4 * i
元素之后,接下来的四个将为 1。再次
+[0] * ((rows * (columns - 1)) - ((columns - 1) * (i + 1))))
也没有必要。您可以简单地存储值 x = ((rows * (columns - 1)) - ((columns - 1) * (i + 1)))
并且您知道最后的 x
元素也将为 0。
总体而言,您的代码如下所示:
constraints_list = []
for i in range(rows):
x = (rows * (columns - 1)) - (columns - 1) * (i + 1)
new_constraint = [i, x]
constraints_list.append(new_constraint)
请注意,每个 new_constraint
的解压缩仍然是不变的,即使使用这个压缩版本,在每个索引处找到一个元素也相当容易。另外,请注意 (rows * (columns - 1)) - (columns - 1) * (i + 1)
中唯一的变量是 i+1
。因此,与其说 x = (rows * (columns - 1)) - (columns - 1) * (i + 1)
,不如说 x = i+1
是绝对必要的,尽管不压缩它可能会更容易。
编辑:我意识到在您的特定 constraints_list
中,绝对没有必要实际存储任何存储空间。您可以简单地拥有一个将 i
、rows
和 columns
作为参数的 build_constraint
函数。一个例子可以是:
def build_constraint(i, rows, columns):
return [0] * (4 * i) + [1, 1, 1, 1] + [0] * ((rows * (columns - 1)) - ((columns - 1) * (i + 1)))
但是,我确实意识到这可能会很不方便,具体取决于您的具体目的,但这是一种选择。它在建立约束方面也不是特别慢。