我最近写完遗传算法。算法创建了50个测试用例的列表,并通过模拟运行该测试,并存储结果。我使用了许多自定义类,存储的结果包含类实例的列表。
当我运行此模拟时,除了永远运行之外,它还会使我的内存使用量达到90 +%。在我的代码中必须有某处只是占用内存,但我不知道如何找到它。这是我的代码的主要部分,循环里面的循环内部循环.....
# ----------------------------------------------------------------------------------------------------
for i in range(1,numberOfRunsToSolve,1): # begin genetic algo loop
temp = trial_cases
for ii, stored_trial in enumerate(temp): # run through stored trial cases
new_trials = []
for jj in range(1,numberOfTrialsPerRound):
tc = []
tc = randomTrials_GenAlgo_ARRAY(stored_trial, True) # create new trial set, based on indexed stored results
new_trials.append(tc)
print(new_trials)
for j, trial in enumerate(new_trials):
x = OneGenerationSimulation(trial) #returns [ObjArray, ErrorArray]
rev = revenueAndLoss(x[0])
DEBUG_ARRAY.append(str(revenue)+' trial: ' + str(trial))
results.append((revenue, trial, x[0],x[1]))
results.sort(reverse=True) # sort to bring best revenue to top
results = results[0:numberOfResultsToKeepPerRound-1]
trial_cases = []
for i, r in enumerate(results):
trial_cases.append(r[1])
# end of the genetic algo loop
# ----------------------------------------------------------------------------------------------------
有关如何在我的脚本中跟踪内存使用情况以及追捕罪犯的任何建议?我对Python很陌生,所以请随意说清楚。
编辑:上面的过程基本上是这样做的: 1)创建50次试运行 2)对每个试验进行模拟。此模拟创建数百个自定义对象,并在其上运行脚本,返回结果。 3)随着所有结果的回归,检索最佳的5个结果。 4)使用这5个结果,创建新的试验集,并重复该过程。
我担心大众对象实例的创建,然后被过滤到最好的5个结果,并没有在内存或其他东西中正确清理......而且所有这些对象都是躲在后台......
谢谢 - KC。
答案 0 :(得分:1)
这是您可以使用的快速而脏的插入排序。您可以内联此代码以避免函数调用开销,而不是函数。
def top_insert(my_list, item, keep_only = 10):
rev = item[0]
newlist = [ i for i in my_list if i[0] > rev]
if len(newlist) >= keep_only:
return newlist[:keep_only]
elif len(newlist) == (keep_only - 1):
return newlist + [item]
else:
return newlist + [item] + my_list[len(newlist):keep_only-len(newlist)-1]