Можете ли вы помочь мне понять, почему эта функция выполняется так плохо? - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь использовать потоки в Python, чтобы читать некоторые файлы (большие файлы, некоторые из них могут превышать размер гигабайта) и анализировать файл, чтобы найти конкретную c информацию, я использую модуль re для который. Проблема в том, что я вижу очень большое время выполнения. Чтение более 4 файлов с последующим анализом файлов на предмет данных занимает у меня более 30 секунд. Ожидается ли это или есть какие-то рекомендации, которые вы можете мне дать, чтобы улучшить это время? Заранее прошу прощения, я уверен, что об этом уже спрашивали на форуме, я действительно пытался найти это сам, но не смог найти нужные слова для поиска этой проблемы.

Ниже мой текущий код :

def get_hostname(file: str) -> str:
    """
    Get the hostname from  show tech/show running file
    :param file: show tech/show running string
    :return: the hostname as a string
    """
    hostname = re.findall('hostname.*', file, flags=re.IGNORECASE)
    if len(hostname) > 0:
        return hostname[0].split(' ')[1]
    else:
        print('Could not find a valid hostname on file ' + file)
def set_file_dictionary():
    threads_list = []
    def set_file_dictionary_thread(file_name: str):
        thread_set_file_dict_time = time.time()
        current_file = open(path + file_name, encoding='utf8', errors='ignore').read()
        files_dir[get_hostname(current_file)] = current_file
        print('set_file_dictionary_thread is ' + str(time.time() - thread_set_file_dict_time))
    for file in list_files:
        threads_list.append(threading.Thread(target=set_file_dictionary_thread, args=(file, )))
    for thread in threads_list:
        thread.start()
    for thread in threads_list:
        thread.join()

Результат:

      set_file_dictionary_thread is 12.55484390258789
      set_file_dictionary_thread is 13.184206008911133
      set_file_dictionary_thread is 16.15609312057495
      set_file_dictionary_thread is 16.19360327720642
      Main exec time is 16.1940469741821

Спасибо, что прочитали меня ПРИМЕЧАНИЕ. Отступы в порядке, по какой-то причине при копировании из Pycharmand

происходит сбой.

1 Ответ

1 голос
/ 03 августа 2020

Во-первых, выполнение регулярного выражения в нескольких потоках python мало поможет. (см. { ссылка })

Во-вторых, вы можете улучшить свою функцию get_hostname следующим образом:

  1. предварительная компиляция регулярного выражения
  2. с использованием search вместо findall, поскольку, по-видимому, вам нужно только первое совпадение
  3. с использованием groups для захвата имени хоста вместо строки split

Вот мой совет get_hostname функция:

hostname_re = re.compile('hostname ([^ ]*)', flags=re.IGNORECASE)
def get_hostname(file: str) -> str:
    match = hostname_re.search(file)
    if match:
        return match.groups()[0]
    else:
        print('Could not find a valid hostname on file ' + file)
...