2 回答
TA贡献1798条经验 获得超3个赞
糟糕,这是优化整数列表的一个糟糕案例。问题是它以整数列表开始:
bin2 = [0] * L
这在内部存储为整数数组。它通常更紧凑,即使在这种情况下它不会改变任何东西——因为在 CPython 上它是一个包含L相同 object 副本的列表0。
但问题是很快,我们将 a 存储long在列表中。此时,我们需要将整个列表变成可以存储任何内容的泛型类型。但!问题是我们看到了 1 亿个零,因此我们创建了 1 亿个0对象。除了列表本身的 800MB 之外,这会立即产生 3 GB 的内存压力。
如果我们像这样初始化列表,我们可以检查问题是否不会发生,以便它确实包含 1 亿次相同的对象:
bin2 = [0L] * L # Python 2.x
bin2[0] = 1
也就是说,在您的示例中,您不需要列表首先包含 1 亿个元素。您可以将其初始化为:
bin2 = [1]
并使用bin2.append(). 这让程序启动得更快,而且在开始时不会占用大量内存。
请注意,PyPy3 仍然比 CPython3 使用更多的内存。
TA贡献1796条经验 获得超7个赞
AFAICT 这里的问题是您将 long 分配给数组,尽管您是模数,但 PyPy 似乎没有注意到该数字仍然适合机器字。
我可以想到两种方法来解决这个问题:
通过分配给该值
bin2[n+1]
通过int()
。使用
array.array()
.
前者只影响 PyPy2,并导致在我的 Mac 上似乎稳定的内存占用为 ~800MB,而后者似乎稳定在 ~1.4GB,无论我是在 PyPy2 还是 PyPy3 中运行它。
不过,我还没有完全运行该程序,所以 YMMV ......
添加回答
举报