Python - 优化内存使用,遗传算法

时间:2017-02-28 19:12:35

标签: python algorithm

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

1 个答案:

答案 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]