Ускорьте назначение строк в список в CythonPython

Программы на Python
Ответить
Anonymous
 Ускорьте назначение строк в список в Cython

Сообщение Anonymous »

Я использовал re для группировки длинной строки и поместил полученные подстроки в список на основе условий, указанных в dict для вывода. Я обнаружил значительное улучшение скорости при использовании Cython по сравнению с Python, но ожидал дальнейшего улучшения.
Простой код в temp_test.pyx:

Код: Выделить всё

cimport cython

import re

@cython.wraparound(False)
@cython.boundscheck(False)
def cleave(str long_str, str rules, dict term_char):
"""
Cleaves a long string into substrings.

"""
cdef:
object compiler = re.compile(rules)
Py_ssize_t i, ns
Py_ssize_t nk = 0
Py_ssize_t nq =  len(long_str)
int p, t
list split_str = compiler.split(long_str)
list substrs = nq * [None]
str s

ns =  len(split_str)
for i in range(ns):
if split_str[i] is not None:
s = split_str[i]
p = len(s)
if p == 1 and s in term_char:
t = term_char[s]
if t == 0:
substrs[nk] = split_str[i - 1]
else:
substrs[nk] = split_str[i] + split_str[i + 1]
nk += 1

return substrs[:nk]
с тестовым кодом:

Код: Выделить всё

from temp_test import cleave
from typing import Dict

def test_cleave():
long_str: str = r"ABCEDFRFR"

rules: str = r"([BD])"
term_char: Dict[str, int] = {"B": 0, "D": 1}

subs = cleave(long_str, rules, term_char)
print(subs)
После использования cython -a для аннотирования temp_test.pyx я обнаружил, что почти все строки выделены. Поскольку расщепление будет вызываться большое количество раз и существует множество назначений строк из списка (т.е., Split_str ) другому списку (т.е. , substrs) в функции, я обнаружил, что всегда существуют такие проверки, как:

Код: Выделить всё

if (unlikely(__pyx_v_split_str == Py_None)) {
PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
__PYX_ERR(0, 24, __pyx_L1_error)
}
__pyx_t_5 = __Pyx_PyList_GET_SIZE(__pyx_v_split_str); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 24, __pyx_L1_error)
__pyx_v_ns = ((Py_ssize_t)__pyx_t_5);
  • Я думаю, отключение этих проверок может повысить производительность. Как этого добиться?
  • Я обнаружил, что @cython.wraparound(False) тоже был выделен множеством проверок (слишком долго не отображается здесь), это потому, что я проверяю ключ в dict? То есть, s в term_char. Есть ли у нас лучшая альтернатива?
Я очень часто использую MemoryView, malloc, calloc < em>и т. д. для числовых операций и вычислений, но не знакомых со строковыми операциями с использованием Cython, любые предложения очень приветствуются.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-cython
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»