这里的一个大问题是,将二进制整数转换为十进制表示法所花费的时间是位数的二次方(至少以 Python 的直接方式)。正如@6502 在他的回答中所做的那样,伪造自己的十进制算术实际上更快。
但是让 Python 的 decimal 模块执行它非常快得多 - 至少在 Python 3.3.2 下(我不知道 Python decimal 内置了多少 C 加速之前的版本)。代码如下:
class S:
def __init__(self):
import decimal
decimal.getcontext().prec = 4000 # way more than enough for 2**10000
p2 = decimal.Decimal(1)
full = []
for i in range(10000):
s = "%s<%s>" % (p2, i)
##assert s == "%s<%s>" % (str(2**i), i)
full.append(s)
p2 *= 2
self.full = "".join(full)
def find(self, s):
import re
pat = s + "[^<>]*<(\d+)>"
m = re.search(pat, self.full)
if m:
return int(m.group(1))
else:
print(s, "not found!")
和示例用法:
>>> s = S()
>>> s.find("1")
0
>>> s.find("2")
1
>>> s.find("3")
5
>>> s.find("65")
16
>>> s.find("7")
15
>>> s.find("00000")
1491
>>> s.find("666")
157
>>> s.find("666666")
2269
>>> s.find("66666666")
66666666 not found!
s.full 是一个超过 1500 万个字符的字符串。它看起来像这样:
>>> print(s.full[:20], "...", s.full[-20:])
1<0>2<1>4<2>8<3>16<4 ... 52396298354688<9999>
所以字符串包含 2 的每个幂,指数跟随在尖括号中的幂。 find() 方法构造一个正则表达式来搜索所需的子字符串,然后向前查找以查找幂。
玩弄这个,我确信几乎任何搜索方式“足够快”。它正在获取占用大量时间的大国的十进制表示。 decimal 模块解决了这个问题。