Python XOR和求和迭代太慢?
我遇到了以下问题:给定s和x,计算同时满足1)s=a+b和2)x=a XOR b的解的数目(a,b)。所有数量和运算都是整数Python XOR和求和迭代太慢?,python,performance,bit-manipulation,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)
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):
tally = 0
z = 0
while z <= s:
q = int(z ^ (s - z))
if x == q:
tally += 1
else:
pass
z += 1
print tally
def应答(s,x):
计数=0
z=0
而z如果(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的False
和True
分别具有0和1的数值这一事实。这样做比使用if
测试更快,如果测试为真,则只增加tall
您可以使用列表来实现xorsum
:
def xorsum_lc(s, x):
return 2 * sum([s - a == x ^ a for a in xrange(s//2 + 1)])
但是它比上面的函数慢;等效的生成器表达式甚至更慢(如预期的那样)。您似乎遗漏了问题的关键部分。您还没有说明为什么要迭代。听起来好像问题不是你说的,而是你应该考虑一些价值观。这个问题的根源是什么?可能重复的@thebjorn有一个;注意集合的使用、缓存和防止额外的查找:查看副本以了解无法对所有值进行求和和和异或的原因。我对问题陈述进行了广泛的编辑,因为我发现原始语句令人困惑。有人应该仔细检查一下。你在考虑什么样的“整数”?如果它是一个具有固定位数的换行整数,那么iff(a,b)是一个解决方案,(a^signbit,b^signbit)也是一个解决方案。谢谢你的上述代码,它大大加快了我的处理时间。
def xorsum_lc(s, x):
return 2 * sum([s - a == x ^ a for a in xrange(s//2 + 1)])