我一直在研究一些代码。我通常的方法是先解决问题的所有部分,在解决问题的过程中创建我需要的循环和其他代码,然后如果我希望重用代码,我会回顾一遍,并将我认为应该分组以创建函数的代码部分组合在一起。在
我刚刚注意到,创建函数并调用它们似乎比编写代码行和删除容器要高效得多。在
例如:
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值传递给了我不记得仍试图删除它们的方法。在
我很欣赏大家分享的见解。不幸的是,我总是对搞清楚引擎盖下的工作原理感兴趣。在
也许你在你的函数中使用了一些局部变量,这些变量是通过引用计数在函数末尾隐式释放的,而它们不是在代码段末尾释放的?在
当你从一个函数返回时,会释放一些额外的内存,但这与最初分配给调用函数的内存一样多。在任何情况下,如果您看到大量的差异,这很可能是运行时状态的产物,而不是您真正应该担心的问题。如果内存不足,解决问题的方法是使用b树(或仅使用数据库)之类的方法在磁盘上保存更多的数据,或者使用占用较少内存的算法。另外,还要注意不要复制不必要的大型数据结构。在
创建函数时真正节省的内存是在你的短期内存中。通过将某些内容移到函数中,可以通过封装部分细节来减少需要记住的细节量。在
您可以使用提供的Python garbage collector interface来更仔细地检查第二种情况下还剩下什么(如果有的话)。具体地说,您可能需要检查gc.get_objects()以查看未收集的内容,或者查看{a3}查看是否有任何引用循环。在
相关问题 更多 >
编程相关推荐