Оптимизация кода Python с помощью Cython - PullRequest
0 голосов
/ 10 июня 2018

Я хотел бы оптимизировать код в Python , чтобы увеличить скорость обработки строк, и мне было интересно, если кто-то может помочь.

Я провел несколько тестов в Cython но я не особо доволен результатами.Мне интересно, можно ли оптимизировать обработку строк или, возможно, я не создал правильный код в Cython .В первом случае взаимодействие со списком строк и простым присваиванием переменной было в среднем примерно в 5 раз быстрее.В другом случае, когда я включил поиск подстроки, увеличение скорости вообще не происходило.

[TL; DR]

У меня есть большие корпуса, которые мне нужно обработать.В настоящее время в чистом Python я перебираю список строк в поисках подстроки и отфильтровываю те элементы (основные строки), которые не содержат данную подстроку.Я создал пару циклов for и надеялся на значительное увеличение скорости после преобразования кода в Cython .

Сначала я проверил, насколько бы быстро выполнялась простая итерация по двум спискам строкбыть, когда строки присвоены переменной:

Результаты:

[Cython][1]: 0.45067 sec
[Python][2]: 2.09907 sec
[Cython][1] approximately 4.5 times faster than [Python][2]

Код в Cython :

def start(itsstr, tokens):
    cdef size_t s
    cdef size_t t
    cdef size_t ns = len(itsstr)
    cdef size_t nt = len(tokens)
    cdef unicode x
    for s in xrange(ns):
        for t in xrange(nt):
            x = itsstr[s]

Python

def start(itsstr, tokens):
    for s in itsstr:
        for t in tokens:
            x = s

Текущий основной код в Python ищет подстроки.Я протестировал увеличение скорости при поиске подстроки в Cython .Результаты следующие:

Результаты:

[Cython][1]: 7.13278 sec
[Python][2]: 8.7094 sec
[Cython][1] 1.2 times faster than [Python][2]

Код в Cython :

def start(itsstr, tokens):
    cdef size_t s
    cdef size_t t
    cdef size_t ns = len(itsstr)
    cdef size_t nt = len(tokens)
    cdef unicode x
    for s in xrange(ns):
        for t in xrange(nt):
            if tokens[t] in itsstr[s]:
                x = itsstr[s]

Код в Python

def start(itsstr, tokens):
    for s in itsstr:
        for t in tokens:
            if t in s:
                x = s

Как вы видите, на самом деле никакого увеличения скорости не происходит.

Я думал о том, что я мог бы сделать в этот момент?Я не опытен в Cython .У меня есть хороший опыт в C / C ++.

Спасибо

...