我在下面编写了这个简单的代码来比较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内存和程序崩溃。
有什么问题?
答案 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可以做的任何事情。