Форум сайта python.su
857
BGсложность n^2, в которой нет необходимости
добился того же, только др способом. Рационально?def count_sogl(value): CONSTANTS = u'цкнгшщзхфвпрлдчсмтб' count = 0 for a in CONSTANTS: count += value.count(a) return count
Отредактировано py.user.next (Дек. 5, 2012 00:41:23)
Офлайн
36
py.user.nextно на практике для слова из 100 букв вариант топикастера отрабатывает, по меньшей мере, в два раза быстрее чем подсчет количества букв, входящих в множество.
для слова из 100 букв будет 200 операций, а не 10000
Офлайн
857
pyuserнепонятно, что ты сравнивал
о на практике для слова из 100 букв вариант топикастера отрабатывает, по меньшей мере, в два раза быстрее чем подсчет количества букв, входящих в множество
def count_sogl(value): CONSTANTS = u'цкнгшщзхфвпрлдчсмтб' count = 0 for a in CONSTANTS: count += value.count(a) return count for a in [u'папа', u'як', u'дорожка']: print a, ' -> ', count_sogl(a), u' согласных'
CONSTANTS = set(u'цкнгшщзхфвпрлдчсмтб') arr = [u'папа', u'як', u'дорожка'] for word in arr: print sum(c in CONSTANTS for c in word)
Офлайн
36
from timeit import timeit CONSONANTS = set("бвгдйжзклмнпрстфхцчшщ") WORD = "".join(CONSONANTS) * 5 # слово из 105 букв def cons_count_1(word): """ вариант топикастера """ return sum(map(word.count, CONSONANTS)) def cons_count_2(word): """ Ваш вариант """ return sum(c in CONSONANTS for c in word) if "__main__" == __name__: import builtins builtins.__dict__.update(locals()) print(timeit("cons_count_1(WORD)")) print(timeit("cons_count_2(WORD)"))
11.795760913747419 24.30858768363018
Офлайн
857
def f1(word): CONSONANTS = set("бвгдйжзклмнпрстфхцчшщ") return sum(map(word.count, CONSONANTS)) def f2(word): CONSONANTS = set("бвгдйжзклмнпрстфхцчшщ") return sum(c in CONSONANTS for c in word) import timeit s = "абвгдеёжзи" t1 = timeit.Timer('f1("{}")'.format(s), 'from __main__ import f1') t2 = timeit.Timer('f2("{}")'.format(s), 'from __main__ import f2') t1.repeat(3) t2.repeat(3)
>>> t1.repeat(3) [7.500285625000288, 7.495358050000505, 7.4992152530003295] >>> t2.repeat(3) [4.4539746159998685, 4.457933652000065, 4.4544935840003745] >>> >>> >>> t1.repeat(3) [7.535601026999757, 7.525300220000645, 7.522909998000614] >>> t2.repeat(3) [4.449643222000304, 4.448924850000367, 4.450461745999746] >>>
def f1(word): CONSONANTS = set("бвгдйжзклмнпрстфхцчшщ") return sum(map(word.count, CONSONANTS)) def f2(word): CONSONANTS = set("бвгдйжзклмнпрстфхцчшщ") return sum(c in CONSONANTS for c in word) import timeit s = "абвгдеёжзи" * 10 t1 = timeit.Timer('f1("{}")'.format(s), 'from __main__ import f1') t2 = timeit.Timer('f2("{}")'.format(s), 'from __main__ import f2') t1.repeat(3) t2.repeat(3)
>>> t1.repeat(3) [8.908654792000561, 8.904308604000107, 8.908578528999897] >>> t2.repeat(3) [19.115710095000395, 19.11386605900043, 19.119253977999506] >>> >>> >>> t1.repeat(3) [8.913373002000299, 8.902025593999497, 8.913000268999895] >>> t2.repeat(3) [19.754902993999167, 19.19199875599952, 19.564209768000183] >>>
Отредактировано py.user.next (Дек. 6, 2012 07:49:01)
Офлайн
36
Офлайн