Trtuaazz 2022-07-17 01:52 采纳率: 60%
浏览 44
已结题

Python求值优化速度

题目如下:

img

要求:

img

我尝试写了一次代码,时间可以通过:


def perm(l):
    if (len(l) <= 1):
        return [l]
    r = []
    for i in range(len(l)):
        s = l[:i] + l[i + 1:]
        p = perm(s)
        for x in p:
            r.append(l[i:i + 1] + x)
    return r

def judge(nums:list):
    result = 0
    for index in range(len(nums)):
        if index+1 == len(nums):
            result += abs(int(nums[index]) - int(nums[0]))
        else:
            result += abs(int(nums[index]) - int(nums[index+1]))
    return result


def main():
    length = int(input())
    nums = list(map(int, input().split(" ")))
    result = perm(nums)
    end = 0
    for nums in result:
        n = judge(nums)
        if n > end:
            end = n
    print(end)


if __name__ == '__main__':
    main();

但是内存占用过大:

img

应该怎么优化代码呢

  • 写回答

2条回答 默认 最新

  • 天际的海浪 2022-07-17 03:47
    关注

    perm()不要把所有排列结果都生成之后再一起返回,这样占用内存太多,应该加yield改为生成器,每次循环迭代时再生成一组排列结果

    def perm(l):  #加yield改为生成器
        if (len(l) == 1):
            yield [l[0]]
        for i in range(len(l)):
            s = l[:i] + l[i + 1:]
            p = perm(s)
            for x in p:
                yield l[i:i + 1] + x
    

    或者直接用现成的itertools.permutations()函数

    import itertools
    result = itertools.permutations(nums)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月25日
  • 已采纳回答 7月17日
  • 创建了问题 7月17日