Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 30, 2010 10:23:13

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рациональное использование CPU.

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)
Ваш поиск на повторы, наверное, самый медленный из всех возможных.

Процессор не может разогнаться из-за перманентного промаха в кэш.



Офлайн

#2 Дек. 30, 2010 10:37:43

baragoz
От:
Зарегистрирован: 2010-09-11
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Спасибо большое, погуглил по Вашему ответу, вроде понял про промах и попадание. И почему проц не работал “на всю катушку”.

А “used = set()” это собственно данные файла? Чет не могу въехать ни как в код.

Да медленный =) полтора часа файл перебирал…



Отредактировано (Дек. 30, 2010 10:39:07)

Офлайн

#3 Дек. 30, 2010 10:41:56

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рациональное использование CPU.

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



Офлайн

#4 Дек. 30, 2010 10:54:47

baragoz
От:
Зарегистрирован: 2010-09-11
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Спасибо за внимание.

Туда ли я попал? http://ru.wikipedia.org/wiki/Хеш-таблица

Я правильно понимаю, что для каждой строки вычисляется хеш как индекс и потом проверяется нет ли элементов с одинаковыми индексами? Т.е. строка - ключ, хеш от ключа - индекс.



Офлайн

#5 Дек. 30, 2010 11:15:23

baragoz
От:
Зарегистрирован: 2010-09-11
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Полтора часа против трех секунд… Я в шоке… Я не хочу просто взять код. Хочу понять как работает.

————-ADD————

файл из 2 000 000 строк (скопировал файл несколько раз) за секунду!!! Сча себя таким быдлокодером ощущаю, что хочется пальцы сломать.

————-ADD————

поправочка - в первый раз меньше чем за секунду пробежал (не туда посмотрел).



Отредактировано (Дек. 30, 2010 11:23:57)

Офлайн

#6 Дек. 30, 2010 11:19:11

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рациональное использование CPU.

Да. Хэш-таблицы могут быть устроены чуть по разному (в Питоне - Кнут, вариант D).
Главное - у них константное время доступа.

В результате мой вариант имеет линейную сложность (одна пробежка по файлу, хэш константный).

Ваш - квадратичный (цикл по строкам, внутри которого .count делает еще одну пробежку).

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



Офлайн

#7 Дек. 30, 2010 11:24:22

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рациональное использование CPU.

baragoz
Полтора часа против трех секунд…
Не переживайте. Я подобную задачку впервые делал много лет назад. Окружающие тоже были изрядно удивлены.



Офлайн

#8 Дек. 30, 2010 11:29:37

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Андрей Светлов
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))
+ нет лишней проверки вхождения
+ запись охапкой (хотя не факт что внтури охапка реализована)

Офлайн

#9 Дек. 30, 2010 11:31:51

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рациональное использование CPU.

А где ваш порядок строк?



Офлайн

#10 Дек. 30, 2010 11:37:18

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Андрей Светлов
А где ваш порядок строк?
а он нужен? если да, тогда этот алгоритм не подойдет.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version