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]
>>>
на длинном слове мой во много раз медленнее
вероятно,
str.count() работает быстрее генератора, и каждый ноль, который получается в генераторе, приходится прибавлять, тогда как в
map() получается последовательность чисел без нулей