我试图找到连续排序字符串中所有整数(实际上是数字)的最快方法。问题让我觉得有一个简单而快速的答案,我根本无法想到。但到目前为止我想出了什么。
设定:
from operator import xor
a = "123"
常规循环
val = 0
for i in a:
val = val ^ int(i)
print val
operations.xor
与reduce
reduce(xor, map(int, list(a)))
我预计第二个会更快,但是当字符串增长时,差异几乎为零。有更快的方法吗?
注1:我想知道是否可以仅使用整数123
而不是字符串"123"
。这将是不合逻辑的,因为我需要一个整数列表,但有时候有趣的答案出现在你从未想到过的地方。
编辑:以下是目前建议的方法的结果。
import timeit
setup = """
from operator import xor
a = "124"
b = 124
"""
p1 = """
val = 0
for i in a:
val = val ^ int(i)
val
"""
p2 = """
reduce(xor, map(int, list(a)))
"""
p3 = """
val = 0
for i in xrange(3):
val = val ^ (b % 10)
b /= 10
val
"""
p4 = """
15 & reduce(xor, map(ord, a))
"""
print 1, timeit.timeit(p1, setup=setup, number = 100000)
print 2, timeit.timeit(p2, setup=setup, number = 100000)
print 3, timeit.timeit(p3, setup=setup, number = 100000)
print 4, timeit.timeit(p4, setup=setup, number = 100000)
# Gives
1 0.251768243842
2 0.377706036384
3 0.0885620849347
4 0.140079894386
另请注意,在流程3中使用int(a)
代替b
会使其慢于4。
答案 0 :(得分:1)
在我的(Python 3)系统上,该解决方案的返工运行速度比显示的快得多:
from operator import xor
from functools import reduce
print(15 & reduce(xor, map(ord, a)))
如果我们知道它们都是数字,15 & ord('5')
以比int('5')
更少的开销拉出我们需要的位。我们可以延迟逻辑"和",最后只做一次。
要使用数字而不是字符串,您可以执行以下操作:
b = 31415926535897932384626433832795028841971693993751058209749445923078164
val = 0
while b:
b, modulo = divmod(b, 10)
val ^= modulo
print(val)