我需要生成所有可能的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秒。
如何让它更快?例如,也许有一种方法可以批量设置所有位,而无需遍历所有位?
答案 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)}