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

0 ответов

Другие вопросы по тегам