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

应该怎么优化代码呢

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)

perm函数使用python自带的吧,你不可能比它自带的还要省空间

from itertools import permutations
# result = perm(nums)
result = permutations(nums)

另外你求绝对值之和的函数也可以优化

def judge(nums:list):
    return sum(abs(x-y) for x,y in zip(nums,nums[-1:]+nums[:-1]))