我不确定这是否与其他 PyPy 内存问题重复,但在这里我将提供一个具体示例。
from __future__ import division
def mul_inv(a, m):
"""Modular multiplicative inverse, a^-1 mod m. Credit: rosettacode.org"""
m0 = m
x0, x1 = 0, 1
if m == 1: return 1
while a > 1:
assert m != 0, "a and m must be coprime"
q = a // m
a, m = m, a%m
x0, x1 = x1 - q * x0, x0
if x1 < 0: x1 += m0
return x1
M = 1000000009
L = 10**8
bin2 = [0] * L
bin2[0] = 1
for n in range(L-1):
bin2[n+1] = (bin2[n] * (4*n + 2) * mul_inv(n+1, M)) % M
if n % 10**5 == 0: print(n, bin2[n])
print(bin2[:20])
使用 python 3.6,程序最多使用 3-4 GB 并运行完成(Armin Rigo 的列表更改不会显着改变这一点)。使用运行 PyPy 5.10.0 的 python 2.7.13,程序快速达到 8 GB(我有多少 RAM)并冻结。即使有gc.collect()调用,程序n也会在大约 3.5 * 10^7时耗尽内存。
这个内存使用来自哪里?唯一的大内存使用应该初始化bin2为 10^8 int 列表。在假设所有局部变量mul_inv都被垃圾收集的情况下,没有其他东西会增加内存使用量。
呼如林
芜湖不芜
相关分类