执行超时(12000ms)kata在Code Wars(Python)上从第2位数字生成数字

时间:2019-12-18 16:55:53

标签: python-3.x

您能给我一个提示,这段代码中耗时的部分在哪里? 这是我来自codewars.com的2位数字生成号码的临时解决方案。 谢谢!

from collections import Counter
from itertools import permutations


def proc_arrII(arr):
    length = Counter(arr).most_common()[-1][1]
    b = [''.join(x) for x in list(set(permutations(arr,length)))]
    max_count = [max(Counter(x).values()) for x in b]

    total = 0
    total_rep = 0
    maximum_pandigit = 0
    for i in range(len(b)):
        total+=1
        if max_count[i] > 1:
            total_rep+=1
        elif int(b[i]) > maximum_pandigit:
            maximum_pandigit = int(b[i])
    if maximum_pandigit == 0:
        return([total])
    else:
        return([total,total_rep,maximum_pandigit])

1 个答案:

答案 0 :(得分:0)

发布时, 提供示例输入会很有帮助, 或链接到original question, 或包含一些python -m cProfile output

这里是次要项目,它会非常轻微地延长运行时间。 在表达式[''.join(x) for x in list(set(permutations(arr, length)))]中 无需致电list( ... )join只需要一个可迭代的对象,而set就可以很好地工作。

这是一个更大的物品。 permutations已经makes the promise “如果输入元素是唯一的,则每个排列中都不会有重复值。” 似乎您想在进入过程中使用set( ... )进行重复操作, 而不是出路 取得算法上的胜利-降低复杂性。

其余的看起来不错。 您可以尝试不使用elif子句进行替补, 而是使用表达式max(map(int, b))。 如果有任何收获,那只会是微不足道的, 将O(n)变成系数稍小的O(n)。 同样,您应该只分配total = len(b)并完成操作, 无需增加多次。