Почему простая программа на python выполняется дольше 20 минут?
Написал программу, она читает файл построчно и записывает одну строку. Программа выполняется дольше 20 минут, на Google Colab этот же программа выполняется за 5 секунд.
Файл из 3,5 миллионов строк длинной по 70 символов. Размер 250 Mb. На ноутбуке intel i7 7th gen.
Подскажите, в чём может быть проблема?
def fun_get_string(datasets_space, f):
start_time = time.time()
print("Создаю строку")
str_chr = str()
with open(datasets_space + "/" + f, "r") as file:
n = 0
for line in file:
if n == 0:
n += 1
continue
str_chr += line.strip()
print("Создал строку")
return str_chr
str_chr = fun_get_string(space_datasets, file_name)
print(len(str_chr))
Да, извините, один принт был лишним, в рабочей версии его нет.
На ноутбуке стоит SSD, не думаю, что дело в нём.
Ответы (1 шт):
Когда вы собираете строку с помощью множества "+=" - это очень не эффективно, т.к. на каждой итерации создаётся новая строка, в которую копируется предыдущая строка плюс новый фрагмент. Если у вас такое происходит 3,5 миллиона раз и на большинстве итераций копировать приходится сначала десятки, а потом и сотни мегабайт, - то это может быть очень долго.
Поэтому в таких случаях стоит добавлять новые фрагменты строки в список, а уже потом из этого списка всего один раз создать итоговую строку с помощью join:
def fun_get_string(datasets_space, f):
start_time = time.time()
print("Создаю строку")
str_list = [] # Поменял здесь
with open(datasets_space + "/" + f, "r") as file:
n = 0
for line in file:
if n == 0:
n += 1
continue
str_list.append(line.strip()) # Поменял здесь
print("Создал строку")
return ''.join(str_list) # Поменял здесь
str_chr = fun_get_string(space_datasets, file_name)
print(len(str_chr))
Напишите, пожалуйста, стало ли быстрее и насколько, а то я сам никогда не замерял, насколько этот способ лучше того, который использовали вы, интересно, что получится.