python中具有不同排列的大数据集

时间:2018-06-27 01:56:23

标签: python data-structures large-data

我有50个字母的组合,我需要将所有这些字母的不同排列打印到一个csv文件中。现在,我正在使用distinct_permutations的more_itertools方法来创建列表。在这50个字母中,其中40个是相同的,其余10个字母是相同的。我使用Mathematica检查了可能的组合(50!/(40!* 10!)),其中有超过100亿个,所以我想知道“ distinct_permutation”是否是最有效的组合方式?因为自从今天早上以来我一直在运行此代码,并且它仍在运行。谢谢。

1 个答案:

答案 0 :(得分:1)

您是否知道数据将在硬盘上占据约TB的空间? ;)
(通常的高清写大约需要6个小时)

此问题等效于组合的生成。您可以尝试itertools combinations方法。如果速度也很慢,请考虑使用位运算。

只有两种类型的字母,问题类似于生成包含10个字母的所有50位数字。 There is fast way以产生这些位模式。在生成过程中,将每个位模式都转换为字母组合(有一些简洁的方法可以在Python中将二进制映射到您的字母,但是我不知道最快的方法)。

简短示例:

def nextperm(v):
    t = (v | (v - 1)) + 1
    w = t | ((((t & -t) // (v & -v)) >> 1) - 1)
    return w

v = 0b0011
print("{0:b}".format(v))
while (v != 0b1100):
    v = nextperm(v)
    print("{0:b}".format(v))

提供输出

11   
101
110
1001
1010
1100

对应于

AABB
ABAB    
ABBA
BAAB
BABA
BBAA

在我的实验中,为初始模式v = 0b00000000000000000000000000000000000000001111111111生成10 ^ 8步(全量程的1/100)无输出花费了60秒

编辑:使用部分实际输出进行的另一项实验。我敢肯定,构建字符串的速度可能会更快,但我不知道Python的最佳方法。我的实现在13秒内(实际大小的1/10000)生成了50 MB的文件,因此完整的生成将花费1.5天。很好地实现字符串构建(以及使用更快的语言代替Python)可能会带来多达10倍的收益。

def nextperm(v):
    t = (v | (v - 1)) + 1
    w = t | ((((t & -t) // (v & -v)) >> 1) - 1)
    return w

def writeout(v):
    outs = ""
    t = v
    for i in range(50):
       outs = alphabet[(t & 1)] + outs
       t = t >> 1
    my_file.write(outs + "\n")

v = 0b00000000000000000000000000000000000000001111111111
alphabet = "AB"
my_file = open("out.txt", "w")
for i in range(1000000):
#while (v != 0b11111111110000000000000000000000000000000000000000):
    writeout(v)
    v = nextperm(v)
writeout(v)
my_file.close()

您还可以尝试在numpy个字母数组上实现“下一个置换”算法,以提供更快的输出。