Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 31, 2009 12:08:31

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

текст А и В, если строчка из текста В есть в А - удалить ее

2 expee
у тебя второй файл где лежат строки для удаления, содержит сколько строк ? если конечно во втором файле пару строк, тогда работает быстро)

у меня первый - 450к, второй - 350к



Отредактировано (Дек. 31, 2009 12:09:12)

Офлайн

#2 Дек. 31, 2009 12:10:10

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

текст А и В, если строчка из текста В есть в А - удалить ее

Одну :D

А мы тут равняемся в скорости.

Кстати код Ed'а валится:

AttributeError: ‘list’ object has no attribute ‘difference’
upd:

Сейчас протестировал на двух файлах одинаковых с 180 000 строк по 150 символов каждая. Т.о. в new должно быть пусто.
expee@localhost:~/dev/python$ time python hehe.py

real 0m2.310s
user 0m0.524s
sys 0m0.184s
expee@localhost:~/dev/python$ time python hehe.py

real 0m1.295s
user 0m0.552s
sys 0m0.168s
expee@localhost:~/dev/python$ time python hehe.py

real 0m0.694s
user 0m0.496s
sys 0m0.192s
expee@localhost:~/dev/python$ time python hehe.py

real 0m0.736s
user 0m0.516s
sys 0m0.188s
expee@localhost:~/dev/python$
И это на моем дюроне с 1.2 mhz и 378мб ram =/ У вас должно быть маленько побыстрее.



Отредактировано (Дек. 31, 2009 12:19:25)

Офлайн

#3 Дек. 31, 2009 12:33:40

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

текст А и В, если строчка из текста В есть в А - удалить ее

я хз откуда у тебя такие цифры .. мб ты нечаяно скрипт на тесле запускаешь?))
у меня даже 7к строк выполняются 5сек
intel T5800 3G озу



Офлайн

#4 Дек. 31, 2009 12:42:22

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

текст А и В, если строчка из текста В есть в А - удалить ее

Хорошо бы :) Но увы, это суровая реальность - amd duron 1200 =/

Вот полный лог сессии в консоли:

expee@localhost:~$ cd dev/python/
expee@localhost:~/dev/python$ ls -l
total 53396
-rw-r–r– 1 expee expee 438 2009-12-31 13:12 hehe.py
-rw-r–r– 1 expee expee 27333306 2009-12-31 12:57 lines
-rw-r–r– 1 expee expee 27333306 2009-12-31 12:57 text
expee@localhost:~/dev/python$ time python hehe.py

real 0m3.976s
user 0m0.468s
sys 0m0.160s
expee@localhost:~/dev/python$ time python hehe.py

real 0m0.831s
user 0m0.544s
sys 0m0.144s
expee@localhost:~/dev/python$ time python hehe.py

real 0m0.690s
user 0m0.504s
sys 0m0.180s
expee@localhost:~/dev/python$
Отсюда видно, что lines и text имеют одинаковый размер ~26мб. И последующие замеры - первый выполняется долго (но не > 5 минут, как сказали), а последующие быстро. У тебя должно быть довольно быстро :)



Офлайн

#5 Дек. 31, 2009 12:52:42

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

текст А и В, если строчка из текста В есть в А - удалить ее

expee
Кстати код Ed'а валится:
AttributeError: ‘list’ object has no attribute ‘difference’
Откуда там взялся list? Там же set.

Код от Ed смешивает все строки, когда упорядочивает в set. Это можно было бы считать дефектом, но условию не противоречит.

Добавлено позже: а вот то, что он удаляет из B одинаковые строки, которых нет в A - это уже дефект.

Ещё добавлено: вам надо составит скрипт, который генерит файлы A и B для теста. А то вы сравниваете разные файлы.



Отредактировано (Дек. 31, 2009 13:04:30)

Офлайн

#6 Дек. 31, 2009 13:22:25

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

текст А и В, если строчка из текста В есть в А - удалить ее

Kogrom
Откуда там взялся list? Там же set.
Я тоже не понимаю откуда :)

а вот то, что он удаляет из B одинаковые строки, которых нет в A - это уже дефект.
Это где? Я старался сделать так, как в исходном варианте было.
Там же тоже set делается, гляньте внимательнее. Или я не о том?

Ещё добавлено: вам надо составит скрипт, который генерит файлы A и B для теста. А то вы сравниваете разные файлы.
Согласен. Думаю, что лучший источник - данные superduck, как топикстартера.
В моих экспериментах я брал 2 одинаковых файла с уникальными строками, чтобы обеспечить наибольшую загрузку.



Офлайн

#7 Дек. 31, 2009 13:52:39

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

текст А и В, если строчка из текста В есть в А - удалить ее

Ed
Это где? Я старался сделать так, как в исходном варианте было.
Там же тоже set делается, гляньте внимательнее. Или я не о том?
Да. Но автор темы тоже делает больше того, что в задании написано.

Если взять какой-нибудь конкретный пример, типа надо удалить из лога какого-нибудь чата все стандартные сообщения сервера. Все стандартные сообщения мы поместили в файл B, а лог - в файл A. Тогда на выходе мы можем получить совсем не то, что ожидали, а мешанину сообщений.



Офлайн

#8 Дек. 31, 2009 13:55:43

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

текст А и В, если строчка из текста В есть в А - удалить ее

Kogrom
Да. Но автор темы тоже делает больше того, что в задании написано.
Для меня заданием было ускорить скрипт топикстартера, а не то, что стоит в топике темы.
Я исходил из того, что скрипт его устраивает, нужно только ускорить его.

Кстати, по моему его мое решение устроило.



Офлайн

#9 Дек. 31, 2009 14:12:01

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

текст А и В, если строчка из текста В есть в А - удалить ее

да, Ed, спс ещё раз, твоё решение устроило.. порядок строк не имеем никакого значения значения.



Офлайн

#10 Дек. 31, 2009 14:20:59

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

текст А и В, если строчка из текста В есть в А - удалить ее

expee
Вот полный лог сессии в консоли:
Вот мой аналогичный лог. Файлы поменьше, правда и питон у меня 2.5, поэтому я убрал использование with:
$ cat hehe.py
#!/usr/bin/env python
# coding=utf-8

lines = open('lines').readlines()
intxt = open('text').read()

for line in lines:
intxt = intxt.replace(line, '')

f = open('new', 'w')
f.write(intxt.replace('\n\n', '\n'))
f.close()
$ ls -la 
total 23564
drwxr-xr-x 2 ed ed 4096 2009-12-31 14:07 .
drwxr-xr-x 7 ed ed 4096 2009-12-31 14:01 ..
-rwxr-xr-x 1 ed ed 227 2009-12-31 14:07 hehe.py
-rw-r--r-- 1 ed ed 12038359 2009-12-31 14:01 lines
-rw-r--r-- 1 ed ed 12038359 2009-12-31 14:02 text
$ time python hehe.py

real 9m43.283s
user 8m35.180s
sys 1m5.836s
Интересно, а как мой скрипт себя показал на ваших данных? Или он все еще падает :) ?



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version