Python“范围”资源消耗

时间:2012-08-15 19:34:03

标签: python memory-management windows-7 python-2.7

我写了以下脚本

基本上,我只是在学习机器学习的Python,并想检查计算密集型任务的执行情况。我观察到,对于10 ** 8次迭代,Python占用了大量的RAM(大约3.8 GB)并且还占用了大量的CPU时间(只是冻结了我的系统)

我想知道是否有办法通过代码或某些全局设置限制时间/内存消耗

脚本 -

initial_start = time.clock()
for i in range(9):
 start = time.clock()
 for j in range(10**i):
  pass
 stop = time.clock()
 print 'Looping exp(',i,') times takes', stop - start, 'seconds'
final_stop = time.clock()
print 'Overall program time is',final_stop - initial_start,'seconds'

5 个答案:

答案 0 :(得分:5)

在Python 2中,range创建了一个列表。请改用xrange。有关更详细的说明,请参阅Should you always favor xrange() over range()?

请注意,no-op for循环是一个非常差的基准测试,几乎没有告诉你任何关于Python的信息。

另请注意,根据gnibbler的评论,Python 3的range就像Python 2的xrange一样。

答案 1 :(得分:2)

Python需要RAM,因为您使用range函数创建了一个非常大的10 ** 8长度列表。这就是迭代器变得有用的地方。

使用xrange代替range

它的工作方式与range的工作方式相同,但不是在内存中创建那么大的列表,xrange只会计算内部索引(每次迭代将其值增加1)。

答案 2 :(得分:2)

看看这个问题:How to limit the heap size?

要解决您的脚本,timeit模块会测量更准确地执行操作所需的时间

>>> import timeit
>>> for i in range(9):
...     print timeit.timeit(stmt='pass', number=10**i)
...
0.0
0.0
0.0
0.0
0.0
0.015625
0.0625
0.468752861023
2.98439407349

你的例子大部分时间都在处理巨大的数字列表。 xrange代替range将有助于解决该问题,但您仍在使用可怕的基准。循环将反复执行而不是实际执行任何操作,因此cpu正忙于检查条件并进入循环。

正如您所看到的,创建这些列表占据了大部分时间

>>> timeit.timeit(stmt='range(10**7)', number=1)
0.71875405311584473
>>> timeit.timeit(stmt='for i in range(10**7): pass', number=1)
1.093757152557373

答案 3 :(得分:1)

如果您正在考虑使用Python进行机器学习,请查看numpy。它的理念是在优化的C中实现所有“内部循环”(矩阵运算,线性代数),并使用Python来操纵输入和输出以及管理高级算法 - 有点像使用Python的Matlab。这为您提供了两全其美的优势:Python的易用性和可读性,以及C的速度。

回到你的问题,对numpy操作进行基准测试将使你对Python的机器学习表现有更真实的评估。

答案 4 :(得分:0)

关于cpu,你有一个for循环运行数十亿次迭代而没有任何类型的睡眠或暂停,所以难怪这个过程完全占用了cpu(至少在一台核心计算机上)。