Производительность 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.
Спасибо!