Почему простая программа на 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 шт):

Автор решения: Xander

Когда вы собираете строку с помощью множества "+=" - это очень не эффективно, т.к. на каждой итерации создаётся новая строка, в которую копируется предыдущая строка плюс новый фрагмент. Если у вас такое происходит 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))

Напишите, пожалуйста, стало ли быстрее и насколько, а то я сам никогда не замерял, насколько этот способ лучше того, который использовали вы, интересно, что получится.

→ Ссылка