Если удалить правую часть списка с помощью
del my_list[pos:]
то по времени это будет O(1) или O(N) ? Как это можно проверить? Я попытался оценить разницу с помощью
pytest-benchmark на таком коде:
def del_slice() -> None:
for _ in range(10_000):
my_list = [1]*1_000_000
del my_list[500_000:]
def del_last() -> None:
for _ in range(10_000):
my_list = [1]*1_000_000
for _ in range(500_000):
del my_list[-1]
def test_del_slice(benchmark):
benchmark(del_slice)
def test_del_last(benchmark):
benchmark(del_last)
Результаты:
----------------------------------------------------------------------------
Name (time in s) Min Max Mean
----------------------------------------------------------------------------
test_del_slice 43.8683 (1.0) 57.6685 (1.0) 48.2936 (1.0)
test_del_last 203.9794 (4.65) 239.6570 (4.16) 226.9720 (4.70)
----------------------------------------------------------------------------
Потом поменял немного:
def del_slice2() -> None:
my_list = [[1]*500_000 for _ in range(5_000)]
for l in my_list:
del l[250_000:]
def del_last2() -> None:
my_list = [[1]*500_000 for _ in range(5_000)]
for l in my_list:
for _ in range(250_000):
del l[-1]
Результаты:
-------------------------------------------------------------------------
Name (time in s) Min Max Mean
-------------------------------------------------------------------------
test_del_slice 27.8310 (1.0) 36.0834 (1.0) 30.5021 (1.0)
test_del_last 87.6777 (3.15) 97.6951 (2.71) 93.4931 (3.07)
-------------------------------------------------------------------------
По моим представлениям, если бы del_slice выполнялся за O(1), разница была бы больше. Возможно, я неправильно замеряю. Если же сложность не O(1), то почему? Ведь перемещать ничего не надо.