我正在尝试在纯CPython fast 中 lex (即,标记化)转义字符串(不依赖于C代码)。< / p>
我能想到的最好成绩如下:
def bench(s, c, i, n):
m = 0
iteration = 0
while iteration < n:
# How do I optimize this part?
# Inputs: string s, index i
k = i
while True:
j = s.index(c, k, n)
sub = s[k:j]
if '\\' not in sub: break
k += sub.index('\\') + 2
# Outputs: substring s[i:j], index j
m += j - i
iteration += 1
return m
def test():
from time import clock
start = clock()
s = 'sd;fa;sldkfjas;kdfj;askjdf;askjd;fasdjkfa, "abcdefg", asdfasdfas;dfasdl;fjas;dfjk'
m = bench(s, '"', s.index('"') + 1, 3000000)
print "%.0f chars/usec" % (m / (clock() - start) / 1000000,)
test()
但是,我的口味仍然有点慢。似乎.index
的调用在我的实际项目中花了很多时间,尽管在这个基准测试中它似乎并不经常发生。
它所需的大多数字符串可以假设为相对较短(例如,7个字符),并且不太可能包含反斜杠。我已经为此做了一些优化。我的问题是:
我是否可以对加速此代码进行任何优化?如果是这样,什么?