我如何释放由“for”引起的内存

时间:2013-08-07 09:22:43

标签: python memory for-loop

我们的游戏程序会将所有玩家的数据初始化到内存中。我的目的是减少不必要的记忆。我追踪了这个程序,发现“for”占用了大量的内存。

例如:

 Line #    Mem usage    Increment   Line Contents
================================================
    52                             @profile
    53    11.691 MB     0.000 MB   def test():
    54    19.336 MB     7.645 MB       a = ["1"] * (10 ** 6)
    55    19.359 MB     0.023 MB       print recipe.total_size(a, verbose=False)
    56    82.016 MB    62.656 MB       for i in a:
    57                                     pass

print recipe.total_size(a,verbose = False):8000098字节

问题是如何释放62.656 MB内存。

P.S。

对不起,我知道我的英语不是很好。我很感激大家读这篇文章。:-)

2 个答案:

答案 0 :(得分:0)

如果你绝对不顾一切地减少循环中的内存使用量,你可以这样做:

i = 0
while 1:
    try:
        a[i]  #accessing an element here
        i += 1
    except IndexError:
        break

记忆统计(如果准确的话):

12     9.215 MB     0.000 MB       i = 0
13     9.215 MB     0.000 MB       while 1:
14    60.484 MB    51.270 MB           try:
15    60.484 MB     0.000 MB               a[i]
16    60.484 MB     0.000 MB               i += 1
17    60.484 MB     0.000 MB           except IndexError:
18    60.484 MB     0.000 MB               break

然而,这段代码看起来很丑陋,而且内存使用量的减少也很小。

答案 1 :(得分:0)

1)而不是list iterator。您应该使用generator。根据您的示例代码:

@profile
def test():
    a = ("1" for i in range(10**6))   #this will return a generator, instead of a list.
    for i in a:
        pass

现在,如果您使用generator 'a'中的for loop,则不会占用太多内存。

2)如果您收到list,请先将其转换为generator

@profile
def test():
    a = ["1"] * (10**6)  #getting list
    g = (i for i in a)   #converting list into a generator object
    for i in g:          #use generator object for iteration
        pass

试试这个。如果有帮助你。