Я пытался оптимизировать простую функцию подсчета символов.После нескольких изменений я решил проверить время и ожидал, что функция с использованием основного цикла while будет быстрее, чем цикл for.
Но, к моему удивлению, цикл был почти на 30% медленнее, чем здесь!Разве не должен быть простой цикл while, который имеет более низкую абстракцию (делает меньше внутри), гораздо быстрее, чем 'for in'?
import timeit
def faster_count_alphabet(filename):
l = [0] * 128 # all ascii values 0 to 127
with open(filename) as fh:
a = fh.read()
for chars in a:
l[ord(chars)] += 1
return l
def faster_count_alphabet2(filename):
l = [0] * 128 # all ascii values 0 to 127
with open(filename) as fh:
a = fh.read()
i = 0
size = len(a)
while(i<size):
l[ord(a[i])] += 1
i+=1
return l
if __name__ == "__main__":
print timeit.timeit("faster_count_alphabet('connect.log')", setup="from __main__ import faster_count_alphabet", number = 10)
print timeit.timeit("faster_count_alphabet2('connect.log')", setup="from __main__ import faster_count_alphabet2", number = 10)
Вот время, которое я получаю:
7.087787236
9.9472761879