我一直在研究一些代码。我通常的方法是首先解决问题的所有部分,在解决问题时创建循环和我需要的其他代码片段,然后如果我希望重用代码,我会回过头来对这些部分进行分组将我认为应该分组以创建函数的代码组合在一起。
我刚刚注意到,创建函数并调用它们似乎比编写代码行并在完成时删除容器更有效。
例如:
def someFunction(aList):
do things to aList
that create a dictionary
return aDict
似乎最后释放的内存比
>>do things to alist
>>that create a dictionary
>>del(aList)
这是预期的行为吗?
编辑添加示例代码
当此函数完成运行时,PF Usage 显示增加了大约 100 mb,filingsList 大约有 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())
如果我改为运行它,我会显示增加了将近 400 mb
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),anInteger,[another list]]。当我开始学习如何操作 gc 对象并检查它们时,我在 gc 中发现了这些对象,即使列表已被强制删除,即使我将 0,1 & 2 值传递给了我不记得的方法尝试仍然删除它们。
我很欣赏人们分享的见解。不幸的是,我总是对弄清楚引擎盖下的工作原理很感兴趣。
最佳答案
也许您在函数中使用了一些局部变量,这些局部变量在函数结束时通过引用计数隐式释放,而在代码段结束时并未释放?
关于python - 将代码包装在函数中时是否会提高内存效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/919103/