【问题标题】:Python process increasing memory RAM usagePython进程增加内存RAM使用率
【发布时间】:2015-11-05 07:42:58
【问题描述】:

我已经使用 python 几个月了,这个问题只是在两三天前出现。 此时我正在 IDLE 3.4.3 python GUI 中运行此代码:

x = [1,2,3,4,5]

for i in x:
   x.append((i * (i + 1))/2)

print(x)

但这并没有输出或错误(不是唯一的),控制台只是打开并等待(就像思考一样) 然后我在任务管理中检查进程,我看到进程以 30-35 mb 开始 在一两分钟后,该过程正在消耗:

我没有安装新软件或操作系统,这发生在两台不同的笔记本电脑(W7 和 W10)上,可能是这个代码,我知道(如果我创建一个新的空列表,它可以工作)但是其他简单的呢1+1 之类的指令 我尝试过使用不同的 IDE,以及包括架构在内的 python 版本。 首先我使用 iPython notebook 和 Spyder,因为我需要绘图,Anaconda 已经准备好了一切,但是内核总是说忙,没有输出;我重新启动,中断,新内核但不起作用,这发生在这周,因为我工作得很好,所以我不得不删除它,因为这种情况正在发生。

有人知道发生了什么吗?

【问题讨论】:

    标签: python-2.7 python-3.x ipython-notebook ram python-idle


    【解决方案1】:

    要看看发生了什么,让我稍微修改一下你的代码

    x = [1,2,3,4,5]
    
    for i in x:
        x.append((i * (i + 1))/2)
        print(x)
        if len(x) > 20:
            break
    
    print(x)
    

    输出如下所示

    [1, 2, 3, 4, 5, 1.0]
    [1, 2, 3, 4, 5, 1.0, 3.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0, 7260.0]
    [1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0, 7260.0, 1.0]
    

    append 只是在列表末尾添加一个新值,因此您所做的是创建了一个无限循环,其中x 只会变得越来越大。基本上,每次迭代器从x 中抽取一个数字时,都会在x 的末尾添加一个新数字,因此迭代器在完成之前总会再抽取5 个数字。

    随着迭代器的不断运行,x 越来越大,并且消耗越来越多的内存。

    要修复这个无限循环,您可以将结果存储在不同的列表中,或者如果您确实希望将结果附加到x,则可以像我上面使用的那样使用break 条件。此外,如果您打算替换 x 中的值,您可以这样做

    x = [1,2,3,4,5]
    
    for i, v in enumerate(x):
        x[i] = (v * (v + 1))/2
    
    print(x)
    

    哪个输出

    [1.0, 3.0, 6.0, 10.0, 15.0]
    

    希望对您有所帮助。

    【讨论】:

    • 当然有帮助,非常感谢 Joseph 的解释,以及关于保持 X 中的值的最后提示。真的很感谢,你教会了我一个新的东西来查看输出。
    • @SirCost:编写最后一个代码示例的更 Pythonic 方式:for i, v in enumerate(x): x[i] = v * (v + 1) // 2
    • @J.F.Sebastian:谢谢!当我写这篇文章时,我完全忘记了 enumerate 函数,但是是的,这更清楚了。
    • 要使代码在 Python 2 和 3 上以相同的方式工作,请使用 // 而不是 / 来获得整数结果。
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 2013-08-07
    • 2015-03-14
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多