XOR和求和迭代太慢了?

时间:2015-04-19 14:02:11

标签: python performance bit-manipulation

我遇到了以下问题:给定s和x,计算满足1)s = a + b和2)x = a XOR b的解(a,b)的数量。所有数量和操作都是整数。

Example Inputs:
    s = 10
    x = 4
Output:
    2

无法导入任何模块。

我写了以下答案,这些答案花了太长时间:

首先:

def answer(s,x):
    tally = 0
    z = 0
    while z <= s:
        p = s - z
        q = int(z ^ p)
        if x == q:
            tally += 1
        z += 1
    return tally

第二

def answer(s,x):
    spotlist, forwardlist = range(0,s+1)
    backwardlist = range(s,-1,-1)
    tally = 0
    for spot in spotlist:
        if x == forwardlist[spot] ^ backwardlist[spot]:
            if s == forwardlist[spot] + backwardlist[spot]:
                tally +=1
    print tally

第三

def answer(s,x):
    tally = 0
    z = 0
    while z <= s:
        q = int(z ^ (s - z))
        if x == q:
            tally += 1
        else:
            pass
        z += 1
    print tally

我认为在删除某些可能的解决方案之前,我遗漏了某些内容或重复了这些内容。

1 个答案:

答案 0 :(得分:1)

如果(a,b)是解对,那么(b,a)也是如此,因此可以将测试范围缩小一半。此外,您可以利用x = a ^ b然后b = x ^ a

这一事实

以下代码的速度是第一个answer()功能的两倍以上 使用s, x = 10, 4,速度提高4倍以上 与s, x = 255, 255

def xorsum(s, x):
    tally = 0
    for a in xrange(s//2 + 1):
        tally += s - a == x ^ a 
    return 2 * tally

此函数使用Python FalseTrue的数值分别为0和1的事实。这样做比使用if测试要快,如果测试为真,则只增加tally


可以使用列表理解来实现xorsum

def xorsum_lc(s, x):
    return 2 * sum([s - a == x ^ a for a in xrange(s//2 + 1)])

但它比上述功能慢;等效的生成器表达式甚至更慢(正如预期的那样)。