Простой код в 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)
Код: Выделить всё
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. Есть ли у нас лучшая альтернатива?
Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-cython
Мобильная версия