Я работал над некоторым кодом. Мой обычный подход заключается в том, чтобы сначала решить все части проблемы, создать циклы и другие фрагменты кода, которые мне нужны, когда я работаю над проблемой, а затем, если я ожидаю повторного использования кода, я возвращаюсь назад и группирую части код вместе, что я думаю, должны быть сгруппированы для создания функций.
Я только что заметил, что создание функций и их вызов кажется гораздо более эффективным, чем написание строк кода и удаление контейнеров, поскольку я с ними закончил.
например:
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 МБ, в filingsList около 8 миллионов строк.
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 мб
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)
EDIT
Я играл с этим еще немного сегодня. Мои наблюдения и вопросы должны быть немного уточнены, так как я сосредоточился на использовании ПФ. К сожалению, я могу только ткнуть в это между моими другими заданиями. Однако я начинаю задумываться о ссылках и копиях. Если я создаю словарь из списка, содержит ли контейнер словаря копию значений, которые пришли из списка, или они содержат ссылки на значения в списке? Я держу пари, что значения копируются вместо ссылок.
Еще одна вещь, которую я заметил, это то, что элементы в списке GC были элементами из контейнеров, которые были удалены. Имеет ли это смысл? Итак, у меня есть список, и предположим, что каждый из элементов в списке был [(aTuple), anInteger, [другой список]]. Когда я начал изучать, как манипулировать объектами gc и проверять их, я нашел эти объекты в gc, хотя список был принудительно удален, и хотя я передал значения 0,1 и 2 методу, который я не помню чтобы попытаться удалить их.
Я ценю то, что люди делятся своими мыслями. К сожалению, мне всегда интересно выяснить, как все работает под капотом.