在Python 3.x中生成位排列的最快方法

时间:2016-11-06 12:08:36

标签: python algorithm python-3.x binary combinations

我需要生成所有可能的N选择K个N位数,其中K位被设置。 我能够提出的最好和最简洁的选择是非常缓慢的:

def kbits(n, k):
    result = set()
    for bits in itertools.combinations(range(n), k):
        s = 0
        for bit in bits:
            s |= 1 << bit
        result.add(s)
    return result

kbits(25, 12)在我的机器上花了8.3秒。

如何让它更快?例如,也许有一种方法可以批量设置所有位,而无需遍历所有位?

1 个答案:

答案 0 :(得分:1)

你的kbits(25, 12)正在计算2个超过五百万次的相同25个幂中的12个,当它只需要计算一次时(并且已经这样做,可以使用sum()内置而不是零碎地建立结果。)

这是一个更短的解决方案,在我的机器上也快了约3倍:

def kbits(n, k):
    powers = [1 << e for e in range(n)]
    return {sum(bits) for bits in itertools.combinations(powers, k)}