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

2024-05-19 22:11:48 发布

您现在位置: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。你知道吗


Tags: 内存in列表newforresultstctrial
1条回答
网友
1楼 · 发布于 2024-05-19 22:11:48

这里有一个快速和肮脏的插入排序,你可以使用。与函数不同,您可以内联此代码以避免函数调用开销。你知道吗

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]

相关问题 更多 >