Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 7, 2017 10:41:15

albertalexandrov
Зарегистрирован: 2017-09-07
Сообщения: 4
Репутация: +  1  -
Профиль   Отправить e-mail  

Ускорение сортировки вставками

Привет, всем!

Сейчас прохожу курс по алгоритмам и структурам данных от ИТМО. Возник вопрос по скорости сортировки вставками.

Задание было дано следующее:

1. Программа должна считывать числа из текстового файла input.txt (проводится 37 тестов, в каждом последующем тесте количество элементов, которые необходимо отсортировать возрастает).
2. После каждой перестановки в выходной текстовый файл output.txt должно записываться сообщение “Swap elements at indices %d and %d.\n' % (j-1, j)”, где j-1 и j - это индексы переставленных элементов.
3. После того как массив отсортирован в output.txt нужно записать сообщение “No more swaps needed” и отсортированный массив.

Скрины с оригинальным заданием ниже.

Листинг программы:

 def main():
    import time
    start = time.time()
    numbers_list = open(file='input.txt', mode='r').read().split()
    with open(file='output.txt', mode='w') as f_output:
        for i in range(1, len(numbers_list)):
            j = i
            while j > 1 and numbers_list[j-1] > numbers_list[j]:
                numbers_list[j], numbers_list[j-1] = numbers_list[j-1], numbers_list[j]
                f_output.write('Swap elements at indices %d and %d.\n' % (j-1, j))
                j -= 1
        f_output.write('No more swaps needed.\n')
        s = ' '.join(numbers_list[1:])
        f_output.write(s)
        f_output.close()
    end = time.time()
    print(end-start)
main()

Тренировался я на массиве 5 3 1. Чтобы я ни делал, не удалось получить время меньше, чем 0,005 секунд.






Как можно ускорить процесс? Прошу подсказать.

Отредактировано albertalexandrov (Сен. 7, 2017 11:48:28)

Прикреплённый файлы:
attachment 2.jpg (134,3 KБ)

Офлайн

#2 Сен. 7, 2017 11:10:13

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ускорение сортировки вставками

Первое, что бросается в глаза это вот

 int(numbers_list[j-1]) > int(numbers_list[j])
Зачем вы кастуете к инту в цикле? Сделайте это один раз выше цикла.



Офлайн

#3 Сен. 7, 2017 11:37:46

albertalexandrov
Зарегистрирован: 2017-09-07
Сообщения: 4
Репутация: +  1  -
Профиль   Отправить e-mail  

Ускорение сортировки вставками

Зачем вы кастуете к инту в цикле? Сделайте это один раз выше цикла.

Наверно осталось еще с прошлых версий программ. Поправил. Ничего не изменилось.

Офлайн

#4 Сен. 7, 2017 11:40:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ускорение сортировки вставками

albertalexandrov

 s = ''
s += ' '.join(numbers_list[1:])
wtf???



Офлайн

#5 Сен. 7, 2017 11:46:35

albertalexandrov
Зарегистрирован: 2017-09-07
Сообщения: 4
Репутация: +  1  -
Профиль   Отправить e-mail  

Ускорение сортировки вставками

wtf???

)) Это я так формирую строку из элементов отсортированного массива для последующей записи в файл за один раз.

А, конкатенацию делать не нужно. И инициализировать тоже.

Отредактировано albertalexandrov (Сен. 7, 2017 11:47:51)

Офлайн

#6 Сен. 7, 2017 11:54:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ускорение сортировки вставками

albertalexandrov
для последующей записи в файл за один раз.
Ваша строка все равно будет записана побайтно. Смысла в этом нет.



Офлайн

#7 Сен. 7, 2017 12:01:39

albertalexandrov
Зарегистрирован: 2017-09-07
Сообщения: 4
Репутация: +  1  -
Профиль   Отправить e-mail  

Ускорение сортировки вставками

Ваша строка все равно будет записана побайтно. Смысла в этом нет.

А как тогда разом записать? Есть такая возможность?

Офлайн

#8 Сен. 7, 2017 12:26:28

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ускорение сортировки вставками

albertalexandrov
Забудьте, тест показывает, что выигрыша по скорости нет, питоний цикл уничтожает все выгоды.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version