Форум сайта python.su
14
with open(outfile, 'w') as dst:
used = set()
for line in open(filename, 'r'):
if line not in used:
used.add(line)
dst.write(line)
Офлайн
0
Спасибо большое, погуглил по Вашему ответу, вроде понял про промах и попадание. И почему проц не работал “на всю катушку”.
А “used = set()” это собственно данные файла? Чет не могу въехать ни как в код.
Да медленный =) полтора часа файл перебирал…
Отредактировано (Дек. 30, 2010 10:39:07)
Офлайн
14
used - множество уже записанных строк. Если новая строка уже есть в used - получаем дубликат, который нужно пропустить.
Множество организовано как хэш таблица - поэтому поиск в нем гораздо быстрее чем по списку.
Офлайн
0
Спасибо за внимание.
Туда ли я попал? http://ru.wikipedia.org/wiki/Хеш-таблица
Я правильно понимаю, что для каждой строки вычисляется хеш как индекс и потом проверяется нет ли элементов с одинаковыми индексами? Т.е. строка - ключ, хеш от ключа - индекс.
Офлайн
0
Полтора часа против трех секунд… Я в шоке… Я не хочу просто взять код. Хочу понять как работает.
————-ADD————
файл из 2 000 000 строк (скопировал файл несколько раз) за секунду!!! Сча себя таким быдлокодером ощущаю, что хочется пальцы сломать.
————-ADD————
поправочка - в первый раз меньше чем за секунду пробежал (не туда посмотрел).
Отредактировано (Дек. 30, 2010 11:23:57)
Офлайн
14
Да. Хэш-таблицы могут быть устроены чуть по разному (в Питоне - Кнут, вариант D).
Главное - у них константное время доступа.
В результате мой вариант имеет линейную сложность (одна пробежка по файлу, хэш константный).
Ваш - квадратичный (цикл по строкам, внутри которого .count делает еще одну пробежку).
Ну и попадание в кэш, да. Выяснение факта, что строка не находится в хэш-таблице - требует меньшего числа чтений страниц памяти. Для больших объемов разница может быть заметна.
Офлайн
14
baragozНе переживайте. Я подобную задачку впервые делал много лет назад. Окружающие тоже были изрядно удивлены.
Полтора часа против трех секунд…
Офлайн
32
Андрей Светловтак, имхо, оптимальнееwith open(outfile, 'w') as dst:
used = set()
for line in with open(filename, 'r'):
used.add(line)
dst = open(outfile, 'w'):
dst.writelines(iter(line))
Офлайн
14
А где ваш порядок строк?
Офлайн
32
Андрей Светлова он нужен? если да, тогда этот алгоритм не подойдет.
А где ваш порядок строк?
Офлайн