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

..bw
Ed
Гы. Судя по тому, что вы написали, выводы вы сделали неправильные. Ну да ладно, закрыли так закрыли. Удачи!
Андрей Светлов
Ребята, не ссорьтесь.
Ваш спор выглядит несколько смешно - оба варианта достаточно хороши.
Настолько, что нужно либо что-то менять в постановке задачи - либо “и так сойдет”.
Если все же хотите меряться скоростью - сделайте на Cython или на Python C API - задачка как раз под это.
К тому же на знании о том, что обрабатываемые байты - str можно еще немного выиграть.
Ed
Да мы и не ссоримся. Я лично люблю расставлять точки над i. Если мне говорят ‘быстрее’, я меряю и оно медленнее, то я так и пишу. А уходить из спора вместо признания что неправ неспортивно. Но это сугубо мое мнение :)
pyuser
Андрей Светлов сделал очень правильное замечание по поводу 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%)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB