我的输出太长,等待结果需要时间(python)



我需要为输入的字符串找到所有可能的组合。字符串的长度要求大于10,并且组合不能重复。

我的代码可以很好地处理10以下的字符串,但在其他情况下等待结果需要相当长的时间。如果字符串超过15;内存错误">

这是我的代码:

def str_replace(str, x, y):
if x == y:
return str
x_val = str[x:x+1]
y_val = str[y:y+1]
if x < y:
str = str[0:x] + y_val + str[x+1:y] + x_val + str[y+1:len(str)]
else:
str = str[0:y] + x_val + str[y+1:x] + y_val + str[x+1:len(str)]
return str
def str_sort(str,x):
if x == len(str):               
global str_list
str_list.append(str)
return
for i in range(x,len(str)):
if str[i] not in str[x:i]:
str = str_replace(str,i,x)  
str_sort(str,x+1)
str = str_replace(str,x,i)  
else:
return
s = input("Input string:")
global str_list
str_list = []
str_sort(s,0)

print(*str_list,sep='n')
print ('Total combinations:',len(str_list))

有没有更好的代码来运行这个程序,或者只是RAM的问题?

有没有更好的代码来运行这个程序

是的,使用在C中实现的itertools.permutations。不是一次计算所有排列并将其存储在列表中,而是在每次迭代中一次生成一次,因此内存占用很小。

请注意,您的控制台可能无法同时显示所有排列。如果字符串足够长,它甚至可能永远打印不完字符串。

s = input('Input string:')
for permutation in itertools.permutations(s):
print(''.join(permutation))
print('Total combinations:', math.factorial(len(s)))

还是只是RAM问题?

是的,正如Barmar所提到的,排列是因子增长的,您正试图将所有这些字符串存储在内存中。

一个由15个字符组成的字符串有1307674368000个排列-math.factorial(15)

一个包含15个字符的字符串消耗64个字节-sys.getsizeof("a"*15)

大列表中的每个元素消耗~8个字节-sys.getsizeof([""]*10**6) / 10**6

因此,您的str_list将消耗87686.46766037178 GiB的内存。你的电脑可能只有32GiB的内存。

最新更新