Почему скрипт работает медленно?

Начал потихоньку изучать программирование, написал простенький скрипт на питоне, шифрующий файлы XOR'ом, но не могу никак понять почему он работает очень медленно (около 1 Мбайт/с):
# Получаем пароль, превращаем его в битовую строку, 
# получаем адрес файла, открываем файл в режиме 'r+b'.

FILE_SIZE = os.path.getsize(file_adress)
BLOCK_SIZE = 1000
block = file.read(BLOCK_SIZE)
for i in range(FILE_SIZE // BLOCK_SIZE):
    file.seek(-BLOCK_SIZE, 1)
    new = []
    for byte in block:
        new.append(byte ^ int(bin_password[-8:], 2))
        bin_password = bin_password[-8:] + bin_password[:-8] # циклический сдвиг
    file.write(bytes(new))
    file.flush()
    block = file.read(BLOCK_SIZE)
file.close()

Что делать? :(
  • Вопрос задан
  • 971 просмотр
Решения вопроса 1
adugin
@adugin Куратор тега Python
Во-первых, перестать постоянно считать в цикле то, что должно быть посчитано вне цикла; во-вторых, не делать того, что делать не нужно:
1) int(bin_password[-8:] - кроме того, что это должно быть константами вне цикла, зачем слайс? Получайте bin_password не через bin, а через '{:08b}'.format(your_int_number).
2) Не проще ли просто последовательно читать из одного файла и писать в другой, а потом при необходмости удалить первый и переименовать второй?
3) Вместо циклического сдвига попробуйте collections.deque.rotate() - хотя с учётом п.1 это большой погоды не сделает.
4) Весь цикл 'for byte in block' поместите в list comprehension, и тогда append не нужен.
5) Вместо range используйте xrange, если Python 2.x
6) Используйте mmap
7) Разделить вычисления и I/O - вынести запись в файл в отдельный тред, пусть параллельно работают. Это классика.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Попробуйте отказаться от многократного вызова append: копируйте исходный список в new и меняйте элементы в нем с доступом через [].
Ответ написан
un1t
@un1t
Если файл небольшой лучше сразу весь в память считать. Если большой увеличь BLOCK_SIZE до нескольких мегабайт хотябы. А вообще конечно сначала выясни, что медленно работает - чтение, запись или преобразование.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы