Как оптимизировать лексинг коротких строк в Python для скорости
Я пытаюсь лексировать (то есть, токенизировать) экранированные строки в чистом CPython быстро (без обращения к C-коду).
Лучшее, что я смог придумать, это следующее:
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
занимает много времени в моем реальном проекте, хотя, похоже, в этом тесте это происходит не так часто.
Можно предположить, что большинство строк, необходимых для lex, являются относительно короткими (скажем, 7 символов) и вряд ли содержат обратную косую черту. Я уже несколько оптимизирован для этого. Мой вопрос:
Могу ли я сделать какие-либо оптимизации, чтобы ускорить этот код?Если да, то?