Недавно я читал некоторые посты о написании кода на Cython, чтобы добиться лучшей производительности для целей НЛП, и я немного запутался. https://medium.com/huggingface/100-times-faster-natural-language-processing-in-python-ee32033bdced например, здесь они используют Cython для циклического перебора элементов документа и подсчета записей конкретных слов;
cdef struct DocElement:
TokenC* c
int length
cdef int fast_loop(DocElement* docs, int n_docs, hash_t word, hash_t tag):
cdef int n_out = 0
for doc in docs[:n_docs]:
for c in doc.c[:doc.length]:
if c.lex.lower == word and c.tag == tag:
n_out += 1
return n_out
def main_nlp_fast(doc_list):
cdef int i, n_out, n_docs = len(doc_list)
cdef Pool mem = Pool()
cdef DocElement* docs = <DocElement*>mem.alloc(n_docs, sizeof(DocElement))
cdef Doc doc
for i, doc in enumerate(doc_list): # Populate our database structure
docs[i].c = doc.c
docs[i].length = (<Doc>doc).length
word_hash = doc.vocab.strings.add('run')
tag_hash = doc.vocab.strings.add('NN')
n_out = fast_loop(docs, n_docs, word_hash, tag_hash)
print(n_out)
этот подход приводит к значительно лучшей скорости по сравнению с чистым Python, но в этом примере предполагается, что у нас есть объект Doc, созданный ранее. Но создание Doc из простого текста - это та часть, где я уже получаю довольно медленную программу для не очень длинных документов (примерно того же размера, о которых они упоминают в посте), даже если я удалю из конвейера все, кроме Tokenizer. Есть ли способ ускорить этот процесс с помощью Cython? Я не знаю, имеет ли мой вопрос какой-либо смысл, но мне действительно нужны некоторые разъяснения по этому вопросу