我正在寻找一种最快的方法(O(n^2)
是不可接受的),以便AND
运算符超过Python
中的两个以上数字。
有两种情况:
输入 a)我们的数字在M和N之间
b)可以有一组任何自然数
目前我的代码在循环中使用& operator
,它总是计算结果位(尽管我们知道,如果我们有0
,那么下一个和所有下一个结果位将会永远是0
)。我的一个想法是计算每列的位数,对于给定的列,在0
时停止计算,因为结果位将为0
。
示例(包含在下面的测试代码中)
现有(迭代),相当慢(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语言中开始实现这一点以及最大化性能的一些想法。
谢谢!
答案 0 :(得分:3)
我会让Python担心优化问题,可以使用functools.reduce
和operator.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