Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 19, 2010 18:06:35

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

фильтр строк?

> что-то пытаетесь доказать
Я? Да мне как-то на всё это положить :-).
Ладно, я сделал необходимые выводы и более этот вопрос мне не интересен, скучно. Считаю данную тему для себя закрытой.

..bw



Офлайн

#2 Авг. 19, 2010 18:14:39

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

фильтр строк?

Гы. Судя по тому, что вы написали, выводы вы сделали неправильные. Ну да ладно, закрыли так закрыли. Удачи!



Офлайн

#3 Авг. 19, 2010 18:32:41

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

фильтр строк?

Ребята, не ссорьтесь.
Ваш спор выглядит несколько смешно - оба варианта достаточно хороши.
Настолько, что нужно либо что-то менять в постановке задачи - либо “и так сойдет”.
Если все же хотите меряться скоростью - сделайте на Cython или на Python C API - задачка как раз под это.
К тому же на знании о том, что обрабатываемые байты - str можно еще немного выиграть.



Офлайн

#4 Авг. 19, 2010 18:43:06

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

фильтр строк?

Да мы и не ссоримся. Я лично люблю расставлять точки над i. Если мне говорят ‘быстрее’, я меряю и оно медленнее, то я так и пишу. А уходить из спора вместо признания что неправ неспортивно. Но это сугубо мое мнение :)



Офлайн

#5 Авг. 20, 2010 02:41:42

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

фильтр строк?

Андрей Светлов сделал очень правильное замечание по поводу timeit в посте http://python.su/forum/viewtopic.php?pid=54540#p54540
я тоже решил проверить, что быстрее:

import timeit
from itertools import ifilter, imap, izip, islice

lst = ["fffdks","fffkdj","fffkdk","fffkdl","fffkjj","fffkjk","fffkjl","fgskdf"]

def _filter(s):
for i in xrange(len(s)-1):
if s[i] == s[i + 1]: return False
return True

def _filter2(s):
for i in xrange(1, len(s)):
if s[i - 1] == s[i]: return False
return True

def _filter3(s):
for a, b in izip(s, islice(s, 1, None)):
if a == b: return False
return True

if "__main__" == __name__:
t1 = timeit.Timer("filter(_filter, lst)",
"from __main__ import _filter, lst, izip, islice")
t2 = timeit.Timer("filter(_filter2, lst)",
"from __main__ import _filter2, lst, izip, islice")
t3 = timeit.Timer("filter(_filter3, lst)",
"from __main__ import _filter3, lst, izip, islice")
print(t1.timeit(100000))
print(t2.timeit(100000))
print(t3.timeit(100000))
получил следующее:
2.09765542827
2.09720285679
2.44857740299
т.е. в данном конкретном случае комбинация izip + islice однозначно медленнее

ЗЫ. запустил выше приведенный скрипт раз 15 - 20, оказывается в большинстве случаев вариант xrange(1, len(s)) ~ на 1 - 2 десятых быстрее варианта xrange(len(s) - 1) :)

ЗЫЫ. натравил профайлер. последний показывает, что самый быстрый вариант _filter3, а самый медленный _filter.
наверно я все же не совсем правильно использую профайлер, вариант с _filter3 от запуска к запуску становится все быстрее и быстрее :)
# к выше приведенному коду добавил функцию
def test():
filter(_filter, lst)
filter(_filter2, lst)
filter(_filter3, lst)
# после строки print(t3.timeit(100000)) добавил
cProfile.run("test()", "test.prof")
буквально после пятого запуска вариант с _filter3 стал в ~3.5 раза быстрее варианта с _filter, хотя при первом запуске разница была гораздо скромнее (~20%)



Отредактировано (Авг. 20, 2010 07:09:55)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version