LINUX.ORG.RU

История изменений

Исправление soomrack, (текущая версия) :

Upd. Но зачем это всё знать, чтобы кодить на питоне? Просто не менять список, если его итерируешь и всё.

Чтобы понимать что ты делаешь, и как твой код будет исполняться. Например, если ты собираешь данные в список, а потом обрабатываешь их последовательно, с удалением из списка (скажем до первой ошибки, что означает, что действительно лучше удалять обработанные данные), то лучше сделать обращение списка, чтобы работало быстрее:

    my_list = [1] * (10**5)
    print(f"len(my_list) = {len(my_list)}")

    timer_on = time.time()
    for k in range(10**5):
        my_list.pop(0)
    timer_off = time.time()
    print(timer_off - timer_on)

    
    my_list = [1] * (10**5)
    print(f"len(my_list) = {len(my_list)}")

    timer_on = time.time()
    my_list.reverse()
    for k in range(10**5):
        my_list.pop()
    timer_off = time.time()
    print(timer_off - timer_on)
len(my_list) = 100000
1.856456995010376
len(my_list) = 100000
0.00843667984008789

При этом еще и с итераторами будет все хорошо.

Исправление soomrack, :

Upd. Но зачем это всё знать, чтобы кодить на питоне? Просто не менять список, если его итерируешь и всё.

Чтобы понимать что ты делаешь, и как твой код будет исполняться. Например, если ты собираешь данные в список, а потом обрабатываешь их последовательно, с удалением из списка (скажем до первой ошибки, что означает, что действительно лучше удалять обработанные данные), то лучше сделать обращение списка, чтобы работало быстрее:

    my_list = [1] * (10**5)
    print(f"len(my_list) = {len(my_list)}")

    timer_on = time.time()
    for k in range(10**5):
        my_list.pop(0)
    timer_off = time.time()
    print(timer_off - timer_on)

    
    my_list = [1] * (10**5)
    print(f"len(my_list) = {len(my_list)}")

    timer_on = time.time()
    my_list.reverse()
    for k in range(10**5):
        my_list.pop()
    timer_off = time.time()
    print(timer_off - timer_on)
len(my_list) = 100000
1.856456995010376
len(my_list) = 100000
0.00843667984008789

При этом еще и с итераторами будет все хорошо (ну если они не выйдут за пределы).

Исходная версия soomrack, :

Upd. Но зачем это всё знать, чтобы кодить на питоне? Просто не менять список, если его итерируешь и всё.

Чтобы понимать что ты делаешь, и как твой код будет исполняться. Например, если ты собираешь данные в список, а потом обрабатываешь их последовательно, с удалением из списка (скажем до первой ошибки, что означает, что действительно лучше удалять обработанные данные), то лучше сделать обращение списка, чтобы работало быстрее:

    my_list = [1] * (10**5)
    print(f"len(my_list) = {len(my_list)}")

    timer_on = time.time()
    for k in range(10**5):
        my_list.pop(0)
    timer_off = time.time()
    print(timer_off - timer_on)

    
    my_list = [1] * (10**5)
    print(f"len(my_list) = {len(my_list)}")

    timer_on = time.time()
    my_list.reverse()
    for k in range(10**5):
        my_list.pop()
    timer_off = time.time()
    print(timer_off - timer_on)
len(my_list) = 100000
1.856456995010376
len(my_list) = 100000
0.00843667984008789