尝试运行此代码时消耗大量内存

时间:2016-06-26 19:25:25

标签: python

尝试运行此代码时:

l = 1000000
w = [1, 1]
for i in range(2, l):
    w.append(w[-1] + w[-2])
计算机挂起,出现蓝屏死机。我得到的唯一信息是关于记忆管理。问题出现在Python的2.7版和3.4版中。

代码适用于l = 100000

有人可以解释我究竟是为什么吗?我在Active Python中使用64位64位,Python 2.7.8 64位。

编辑:

以下是适用的R代码:

len <- 1000000
fibvals <- numeric(len)
fibvals[1] <- 1
fibvals[2] <- 1
for (i in 3:len) { 
   fibvals[i] <- fibvals[i-1]+fibvals[i-2]
} 

3 个答案:

答案 0 :(得分:6)

你制作的数字比你想象的还要多。例如,这是最后一个内存的大小:

>>> a, b = 1, 1
>>> for i in xrange(2, 1000000):
...     a, b = b, a+b
...
>>> sys.getsizeof(b)
92592

对于一个整数,这是92千字节。所有这些都放在46-ish千兆字节附近,而你只有16千兆字节。

你的R代码使用的是64位浮点数,在第1476位左右迅速溢出到无穷大。

答案 1 :(得分:2)

斐波那契数量巨大。在R和其他语言中,整数溢出,因此不需要那么多内存。但在Python中,整数根本不会溢出。第1000000个斐波纳契数需要太字节的空间。一旦您的操作系统耗尽了所有物理RAM,它就会切换到硬盘交换。当它耗尽时,就会出现内核故障。

答案 2 :(得分:0)

在python列表中占用太多内存空间。尝试使用元组

示例代码:

l = 1000000
w = (1,1)
for i in xrange(2,l):
    w = w + (w[-1] + w[-2],)

执行程序需要时间,这取决于你的cpu和主存储器的数量。