【发布时间】:2020-05-10 23:01:32
【问题描述】:
我正在完成一个问题,我创建了一个函数,该函数接受一个正整数并返回下一个更大的数字,该数字可以通过重新排列其数字来形成。例如:12 --> 21, 513 --> 531, 12435 --> 12453, 9817121211 --> 9817122111。
我一遍又一遍地重新编译我的代码以提高性能,但最终停止了,我无法更快地获得它。有人有建议吗?它的 itertools.permutations 行占用了绝大多数时间。
def next_bigger(n):
num = str(n)
num1 = set(int(x) for x in str(num))
if num == num[0] *len(num):
return -1
#full_set = set(num)
lis = set(int(''.join(nums)) for nums in itertools.permutations(num, len(num)))
lis = sorted(lis)
try:
return int(lis[lis.index(n)+1])
except Exception:
return -1
问题链接:https://www.codewars.com/kata/55983863da40caa2c900004e/train/python
【问题讨论】:
-
建议是,排列仍然是暴力破解你的方式。在使用的算法本身不是最理想的情况下,责怪实现的性能是没有意义的。那么,接下来的问题是:什么是“更智能”的方式来做到这一点?
-
@ParitoshSingh ,您是指一种更聪明的排列方式,还是您认为我通过这种整体方法走上了一条死胡同。我试图编写一个代码,其中 itertools 只返回第一个数字至少与 num[0] 一样高但可以使其工作的解决方案。
-
如果我让你做这个任务,作为一个人,而不是一台电脑,你会怎么做?您可能不会开始暴力破解所有可能的数字排列。手动尝试,并利用获得的见解编写更好的程序。
-
确实,比遍历所有排列更智能的算法会提供最好的加速。但是,如果您需要继续使用排列方法,可以在这里进行一些加速:跳过计算
set(您不关心这里的重复),尽快丢弃较小的数字(在理解中使用 if 子句),然后使用min查找下一个数字而不是排序。您也可以尝试跳过循环中的int,这可能更快或更慢。 -
@user2357112supportsMonica 感谢您的建议。根据您的建议更改了我的代码。已在下方回答。
标签: python performance itertools