生成一个文件,该文件的所有可能组合字符串的长度为0,1,且长度很大,没有itertools

时间:2018-09-06 17:19:59

标签: python combinations

我想使用所有可能的组合生成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

您是否知道如何改进我的代码?我该如何减少内存消耗并尝试更大的数字?

1 个答案:

答案 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

我不会等待结果。