Python按位和多个数字,比迭代按位运算符更快?

时间:2015-06-30 16:59:12

标签: python algorithm

我正在寻找一种最快的方法(O(n^2)是不可接受的),以便AND运算符超过Python中的两个以上数字。

有两种情况:
输入 a)我们的数字在M和N之间 b)可以有一组任何自然数

目前我的代码在循环中使用& operator,它总是计算结果位(尽管我们知道,如果我们有0,那么下一个和所有下一个结果位将会永远是0)。我的一个想法是计算每列的位数,对于给定的列,在0时停止计算,因为结果位将为0

示例(包含在下面的测试代码中)

Bitwise puzzle explained on an example

现有(迭代),相当慢(O(n^2))代码:

def solution(M, N):
    result = M
    for x in xrange(M, N):
        result &= x
    return result


def solution_sets(N):
    result = N[0]
    for x in N:
        result &= x
    return result


print solution(5, 7)  # 4
print solution(64, 128)  # 64
print solution(44, 55)  # 32
print solution_sets([60, 13, 12, 21])

如果此解决方案可扩展为例如XOR运算符,那将是很好的。

我正在询问有关如何在Python语言中开始实现这一点以及最大化性能的一些想法。

谢谢!

1 个答案:

答案 0 :(得分:3)

我会让Python担心优化问题,可以使用functools.reduceoperator.and_

为序列写一个简单的文章
>>> functools.reduce(operator.and_, [60, 13, 12, 21])
4

将其包含在函数中

def solution_sets(l):
    return functools.reduce(operator.and_, l)

使用timeit,在以下环境中执行此操作1000000次需要0.758秒:

  在win32上

Python IDLE 3.4.1 (v3.4.1:c0e311e010fc,2014年5月18日,10:38:22)[MSC v.1600 32位(英特尔)]   处理器 Intel Core i7-3740QM CPU @ 2.70 GHz
  内存 16.0 GB
  操作系统 64位Windows 7

setup = '''
import functools
import operator

def solution_sets(l):
    return functools.reduce(operator.and_, l)'''

>>> timeit.timeit('solution_sets([60, 13, 12, 21])', setup)
0.7582756285383709