Python-优化记忆使用情况,遗传算法



我最近完成了遗传算法。Algo创建了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。

这是您可以使用的快速且肮脏的插入排序。您可以将此代码内联而不是功能,以避免函数呼叫开销。

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]

最新更新