Python使用了大量的RAM

MOO*_*OON 0 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
Run Code Online (Sandbox Code Playgroud)

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

有什么问题?

Mar*_*ers 16

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

改用xrange()功能 ; 这会产生一个只在迭代时产生数字的对象:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

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

我相当老化的2008年老式Macbook Pro做到了这一点:

>>> import timeit
>>> timeit.timeit('sum(xrange(10**9))', number=3)
38.89629793167114
Run Code Online (Sandbox Code Playgroud)

因此平均需要13秒来生产和销毁10亿个int物体.实际的总结与这里的分配和解除分配相形见绌.

使用NumPy进行涉及大型数据集的计算; NumPy array拥有C数据类型,而不是Python对象,因此占用的内存将大大减少,而且库提供了优化的例程,这些例程将超越纯Python可以做的任何事情.

  • @yashar:因为`int`不是简单的C整数.它是一个带有方法和引用计数等的对象,它是无限的(除了内存).数字<`sys.maxint`占用24个字节,而不是4个字节. (2认同)