Python使用了大量的RAM

时间:2014-02-14 16:59:12

标签: python python-2.x

我在下面编写了这个简单的代码来比较Python和Fortran的速度。

import time

start = time.time()

x = 0

for i in range(1,1000000000):
    x = x + i
    x = 0

end = time.time()

print end - start

我设置x = 0因为在Fortran中它溢出。当我通过Fortran运行代码时,它会在9秒内返回答案,但是当我通过Python运行代码时,Python会占用系统内存的所有24GB内存和程序崩溃。

有什么问题?

1 个答案:

答案 0 :(得分:16)

您正在使用range(),它会生成范围内所有整数的列表对象。您生成了一个列表对象,其中包含10 ** 9个整数。在一台64位的机器上,只需30GB即可容纳所有这些对象,只要你的操作系统可以让你分配那么多。

使用xrange() function代替;这会生成一个只在迭代时产生数字的对象:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> xrange(10)
xrange(10)
>>> list(xrange(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

总计10亿个整数仍需要花时间在Python上;您可以使用sum(xrange(10**9))将大部分工作委托给C代码,但是您仍然会为该流程生成10亿个整数对象。

我相当老化的2008年份Macbook Pro就是这样做的:

>>> import timeit
>>> timeit.timeit('sum(xrange(10**9))', number=3)
38.89629793167114

因此平均需要13秒才能生成和销毁10亿个int个对象。实际的求和与这些分配和解除分配相比相形见绌。

使用NumPy代替涉及大型数据集的计算; NumPy array拥有C数据类型,而不是Python对象,因此占用的内存要少得多,而且库提供了优化的例程,这些例程可以击败纯Python可以做的任何事情。