当代码被包装在函数中时,是否可以提高内存效率?

2024-10-03 21:26:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在研究一些代码。我通常的方法是先解决问题的所有部分,在解决问题的过程中创建我需要的循环和其他代码,然后如果我希望重用代码,我会回顾一遍,并将我认为应该分组以创建函数的代码部分组合在一起。在

我刚刚注意到,创建函数并调用它们似乎比编写代码行和删除容器要高效得多。在

例如:

def someFunction(aList):
    do things to aList
    that create a dictionary
    return aDict

似乎最后释放的记忆比

^{pr2}$

这是预期的行为吗?在

编辑添加的示例代码

当这个函数运行完毕后,PF的使用量增加了大约100mb,fillingslist有大约800万行。在

def getAllCIKS(filingList):
    cikDICT=defaultdict(int)
    for filing in filingList:
        if filing.startswith('.'):
            del(filing)
            continue
        cik=filing.split('^')[0].strip()
        cikDICT[cik]+=1
        del(filing)
    ciklist=cikDICT.keys()
    ciklist.sort()
return ciklist

allCIKS=getAllCIKS(open(r'c:\filinglist.txt').readlines())

如果我运行这个,我会显示增加了将近400MB

cikDICT=defaultdict(int)
for filing in open(r'c:\filinglist.txt').readlines():
    if filing.startswith('.'):
        del(filing)
        continue
    cik=filing.split('^')[0].strip()
    cikDICT[cik]+=1
    del(filing)

ciklist=cikDICT.keys()
ciklist.sort()
del(cikDICT)

编辑 我今天一直在玩这个。我的观察和问题应该再细化一点,因为我的重点是PF的使用。不幸的是,我只能在其他任务之间挑刺。然而,我开始怀疑参考文献和副本。如果我从列表创建字典,字典容器是否保存来自列表的值的副本,还是保存对列表中值的引用?我打赌这些值是复制的而不是引用的。在

我注意到的另一件事是GC列表中的项是从容器中删除的项。有道理吗?所以我有一个列表,假设列表中的每一项都是[(aTuple),一个整数,[另一个列表]]。当我开始学习如何操作gc对象并检查它们时,我在gc中找到了这些对象,即使列表已被强制删除,即使我将0,1&2值传递给了我不记得仍试图删除它们的方法。在

我很欣赏大家分享的见解。不幸的是,我总是对搞清楚引擎盖下的工作原理感兴趣。在


Tags: 方法函数代码列表returndef容器解决问题
3条回答

也许你在你的函数中使用了一些局部变量,这些变量是通过引用计数在函数末尾隐式释放的,而它们不是在代码段末尾释放的?在

当你从一个函数返回时,会释放一些额外的内存,但这与最初分配给调用函数的内存一样多。在任何情况下,如果您看到大量的差异,这很可能是运行时状态的产物,而不是您真正应该担心的问题。如果内存不足,解决问题的方法是使用b树(或仅使用数据库)之类的方法在磁盘上保存更多的数据,或者使用占用较少内存的算法。另外,还要注意不要复制不必要的大型数据结构。在

创建函数时真正节省的内存是在你的短期内存中。通过将某些内容移到函数中,可以通过封装部分细节来减少需要记住的细节量。在

您可以使用提供的Python garbage collector interface来更仔细地检查第二种情况下还剩下什么(如果有的话)。具体地说,您可能需要检查gc.get_objects()以查看未收集的内容,或者查看{a3}查看是否有任何引用循环。在

相关问题 更多 >