您能给我一个提示,这段代码中耗时的部分在哪里? 这是我来自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])
答案 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)
并完成操作,
无需增加多次。