有没有一种方法可以在 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 中,绝对没有必要实际存储任何存储空间。您可以简单地拥有一个将 irowscolumns 作为参数的 build_constraint 函数。一个例子可以是:

def build_constraint(i, rows, columns):
    return [0] * (4 * i) + [1, 1, 1, 1] + [0] * ((rows * (columns - 1)) -  ((columns - 1) * (i + 1)))

但是,我确实意识到这可能会很不方便,具体取决于您的具体目的,但这是一种选择。它在建立约束方面也不是特别慢。