Форум сайта python.su
0
что такое “охапка”?
Офлайн
14
ИМХО, задачка звучит как “удалить повторяющиеся”, а не “случайно перемешать при этом оставшиеся”.
Офлайн
14
Имелось в виду, что dst.writelines будет работать быстрее нескольких dst.write.
Разница мизерная, только на игре с GIL. Не верите - смотрите исходники.
Файловый кеш практически всё нивелирует.
Офлайн
0
Кстати у меня почему-то на такую конструкцию ругается
for line in with open(filename, 'r'):
with open(filename, 'r') as srs:
for line in srs:
...
Офлайн
14
то я ошибся. Должно быть
for line in open(filename, ‘r’):
Ваш вариант даже лучше - файл корректней закрывается
Офлайн
0
Аааа ясно.
Спасибо огромное за урок! =)
Качаю книгу Кнута, хочу почитать про его алгоритм с таблицами (интернет подвел на этот раз с описанием).
Если возникнут вопросы буду сюда писать и надеяться на Ваше терпение =) Уж очень хочется посмотреть на его хеш-таблицу, индексы и т.д. наглядно.
Офлайн
253
Мне код Андрея тоже понравился, но тема про рациональное использование процессора в котором как указал автор - 4 ядра. Чем больше файл тем больше времени будет проводится в
used.add(line)
if line not in used:
Офлайн
14
Сомневаюсь. Поток входных данных один, выполнение строго последовательное.
Не вижу простого способа распараллелить на потоки или на процессы.
И, главное, затык был в другом. Алгоритмическая сложность и большой объем.
Немного о кеше:
Полмиллиона строк - это полсотни мегабайт для типичного лога. Объекты строк равномерно размазаны по этим мегабайтам. Сравнение строк быстрое (сперва пробуется все тот же хэш), но эти строки перед использованием нужно переместить в L2 кэш процессора. L1 пренебрежимо быстрый.
L2 бывает разный, но в любом случае это - несколько мегабайт. Целиком не помещается. Процессор постоянно промахивается и получает пенальти, пока данные перегоняются из памяти в L2. И это - основные трудозатраты (вычислений почти нет).
Для хэш-таблицы ее тело - это непрерывный массив пар хэш (int)-> элемент (PyObject*).
Все тело прочно сидит в L2 и промахов нет - вот оно и гораздо быстрее.
Офлайн
-2
baragozВзять_и_уе..ть.jpg. У тебя проверка будет с классом сложности O(n**2) вместо O(n*log(n)).
# проверка наличия повторяющихся элемнетов
for i in xrange(len(list)-1, -1, -1):
if list.count(list) != 1:
del list
Отредактировано (Янв. 9, 2011 17:56:19)
Офлайн
14
asilyatorКак пропуск тактов конвейером. Детали сильно отличаются в разных реализациях.
А пенальти защитывается программе как процессорное время?
Офлайн