Производительность Django runserver для функций, не выполняющих запросы

Я нашел здесь много вопросов, которые касаются производительности runserver, но все они были связаны с производительностью запросов и ответов. Мой вопрос касается производительности методов класса, которые выполняются из представлений.

Я совсем новичок в Django, поэтому простите меня за ошибки в общей практике Django и давайте попробуем сосредоточиться на моем вопросе.

Упрощенно, для наглядности, мой текущий проект выглядит следующим образом:

search
├── manage.py
├── retrieval
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── retrieval_execution
│   │   └── retrieval_execution.py
│   ├── urls.py
│   └── views.py
├── core
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── test.py

В файле retrieval_execution.py у меня есть следующие методы, которые выполняются через views.py:

def delta_decoder(self, delta_encoded_inverted_list):
    """
    input params:
    v_byte_encoded_inverted_list : dictionary
        one key being the word, and values a list with delta encoded doc_id and decoded positions

    return:
    inverted list in its original format {word: [document_count, [[doc_number, [positions]]]}
    """
    doc_count, delta_pos_combos = delta_encoded_inverted_list # int, list
    list_out = [doc_count, {}]

    # add the first doc number manually
    current_doc_num, positions = delta_pos_combos[0] # int, list
    list_out[1][current_doc_num] = positions # add doc and pos to doc_pos dict

    for delta_pos_combo in delta_pos_combos[1:]:
        delta, positions = delta_pos_combo
        current_doc_num = current_doc_num + delta
        list_out[1][current_doc_num] = positions

    return list_out

def mini_index_builder(self):
    self.mini_index = {}

    start_time = datetime.datetime.now()

    for word in self.pre_processed_query:
        if word in self.inverted_index:
            decoded_list = self.delta_decoder(self.inverted_index[word])
            self.mini_index[word] = decoded_list

    print(f"building the mini index and decoding took {datetime.datetime.now() - start_time}")

    # check if mini_index is valid (at least one word of query is in the index)
    return self.valid_index()

def valid_index(self):
    """
    If the index does not return any documents,
    we can instantly return a page saying there
    are no results for the input query.
    """
    if len(self.mini_index.keys()) == 0:
        return False
    else:
        return True

Чтобы проверить код локально с терминала, я создал файл test.py на уровне базового каталога, который выполняет приведенный выше код так же, как это делает views.py.

Теперь мой вопрос заключается в следующем: Я заметил, что время, которое занимает выполнение фрагмента кода, примерно в два раза больше, когда я выполняю его через views.py на runserver, чем когда я запускаю test.py локально (я знаю, что datetime.now() не является идеальным способом тестирования времени выполнения, но это был самый быстрый способ, который я смог придумать). Я пробовал несколько раз с разными входными данными, и результаты совпадают. Это действительно удивило меня, и чисто из любопытства я хотел бы узнать, может ли кто-нибудь объяснить, почему это занимает гораздо больше времени при использовании runserver.

Спасибо!

Вернуться на верх