x *字符串

时间:2016-07-30 04:07:16

标签: python performance complexity-theory xor

我试图找到连续排序字符串中所有整数(实际上是数字)的最快方法。问题让我觉得有一个简单而快速的答案,我根本无法想到。但到目前为止我想出了什么。

设定:

from operator import xor
a = "123"
  • 常规循环

    val = 0
    for i in a:
        val = val ^ int(i)
    print val
    
  • operations.xorreduce

    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。

1 个答案:

答案 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)