我想使用所有可能的组合生成0和1s的大字符串(最多1000个),而不使用itertools。我的代码可以很好地处理长度为20的字符串,但数字较大时会遇到问题。
exponent=input("String length:")
n= int(exponent) #Convert to integer the input
#Define a function to get the calc
def combinations(n):
# If the length of the string is 0 just write "empty string".
if n < 1:
print("empty string")
else:
for i in range(2**n):
# 2 raised to n power gives the total combinations
s = bin(i)[2:]
# Bin converts to binary the number
s = "0" * (n-len(s))+s
print(s)
print(combinations(n))
当我尝试使用50之类的大数时,会收到以下消息:
for i in range(2**n):
OverflowError: range() result has too many items
您是否知道如何改进我的代码?我该如何减少内存消耗并尝试更大的数字?
答案 0 :(得分:1)
由于range
占用过多内存,因此只需手动构建迭代循环即可:
i = 0
limit = 2**(n+1) - 1
while i <= limit:
print(bin(i)[2:].zfill(n))
i += 1
但是请注意,您仍然受限于具有大约10 ^ 79个粒子(约2 ^ 263)的宇宙。在大量输入之前,先time
用小写的字母,然后计算大号字母需要花费多长时间。
在我的桌面怪兽上,我可以在超过45秒的时间内打印出所有长度为20的字符串。扩大规模,我应该能够处理您期望的1000英寸长度...
45 * 2**(1000-20) sec
= 2**5.5 * 2**980 sec
= 2**985.5 sec
现在,一个世纪中大约有2 ^ 31.5秒...
= 2**(985.5 - 31.5) centuries
= 2**954 centuries
或者,换一种方式,我可以在大约一个世纪内产生所有长度为46的字符串的输出。在您的屏幕上,如果您将“小”盒装成50盒,大约可以在公元3600年左右完成。
即使采用更快的渲染方法,我们也无法解决您的“大”问题。我当前打印那些20个字符的二进制文件的速度仅为每秒23k(2 ^ 14.5)。让我们假设有一台比我的桌面怪物快一点的机器,比如说一个1000 GHz的机器,它在每个时钟周期产生一个新的字符串。那是每秒2 ^ 40个字符串。
哦,天哪!现在,以完美的渲染速度,我们可以在2 ^ 10秒内完成50个字符的工作,或者仅用17分钟而不是16个世纪。这样一来,整个1000个字符的工作就会拉到
= 2**960 sec
= 2**(960 - 31.5) centuries
= 2**928.5 centuries
我不会等待结果。