我在下面写了这个简单的代码来比较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可以做的任何事情.
| 归档时间: |
|
| 查看次数: |
655 次 |
| 最近记录: |