【问题标题】:Python "range" resource consumptionPython“范围”资源消耗
【发布时间】:2012-08-12 03:23:54
【问题描述】:

我写了以下脚本

基本上,我只是在学习用于机器学习的 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'

【问题讨论】:

  • 然后执行一些计算密集型的操作。迭代一个长列表是否给了您任何见解?
  • 您对计算密集型应用占用大量 CPU 感到惊讶吗?
  • 大家好。非常感谢你的帮助。这是我在 Stackoverflow 上的第一个问题。但我没有得到我想要的答案。我的问题是 - '如何限制 Python 程序的时间/内存消耗?如果我最终运行了一些非常繁重的代码(糟糕的编程/大量数据等),我不希望它让我的系统崩溃'

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


【解决方案1】:

在 Python 2 中,range 创建一个列表。请改用xrange。更详细的解释见Should you always favor xrange() over range()?

请注意,无操作 for 循环是一个非常糟糕的基准测试,它几乎不会告诉您有关 Python 的任何信息。

另请注意,根据 gnibbler 的评论,Python 3 的 range 与 Python 2 的 xrange 类似。

【讨论】:

  • 请注意,Python3 中的 range() 与 Python2 中的 xrange() 类似
【解决方案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】:

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

    使用xrange 而不是range

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

    【讨论】:

    • 嗨罗斯蒂斯拉夫。非常感谢你的帮助。这是我在 Stackoverflow 上的第一个问题。但我没有得到我想要的答案。我的问题是 - '如何限制 Python 程序的时间/内存消耗?如果我最终运行了一些非常繁重的代码(糟糕的编程/大量数据等),我不希望它让我的系统崩溃'
    【解决方案4】:

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

    回到您的问题,对 numpy 操作进行基准测试可以让您更真实地评估 Python 在机器学习方面的性能。

    【讨论】:

      【解决方案5】:

      关于 cpu,你有一个 for 循环运行了数十亿次迭代,中间没有任何睡眠或暂停,所以难怪该进程完全占用 cpu(至少在单核计算机上)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多