Тест Python: почему цикл в цикле быстрее простого? - PullRequest
0 голосов
/ 17 декабря 2018

Я пытался оптимизировать простую функцию подсчета символов.После нескольких изменений я решил проверить время и ожидал, что функция с использованием основного цикла 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

1 Ответ

0 голосов
/ 17 декабря 2018

While Loop

Хорошо в вашем цикле while интерпретатор должен проверять каждую итерацию, является ли ваше выражение истинным, поэтому он должен получить доступ к элементам i и size и сравнить их.

Для цикла

С другой стороны, цикл for не нуждается в этом, поскольку цикл for оптимизирован, поскольку Chris_Rands уже указывал

...