Самый эффективный способ удалить последний элемент списка? - PullRequest
3 голосов
/ 03 июня 2019

Со списком: [-1, 0, 43, 128, 32] есть несколько способов удалить последний элемент.

  • list.pop()
  • list = list[:-1] (не рекомендуется?)
  • del list[-1]
  • И, вероятно, еще пара ...

Они все вернут [-1, 0, 43, 128], но что наименее вычислительно интенсивно и имеет ли это значение? Мне известны такие модули, как timeit, которые я мог бы использовать, чтобы проверить это для себя. Но я настороженно отношусь к неконтролируемым переменным, и моя неопытность может определенно ослабить результаты. Кроме того, лучший вариант отличается для строк, или чисел с плавающей точкой, или логических значений? А как насчет многомерных списков?

Я не совсем уверен, как контролировать и тестировать эти переменные, поэтому я решил, что я бы попросил здесь проверить, существует ли общая иерархия.

Не является дубликатом Разница между del, remove и pop в списках

Этот вопрос объясняет различия между методами удаления, но не касается нарезки. Это также не относится к скорости вообще. В принятом ответе содержатся расплывчатые упоминания об эффективности, которые, как я вижу, являются частью решения, но я не вижу, как оно сочетается с нарезкой.

1 Ответ

4 голосов
/ 03 июня 2019

Как указано в Python wiki . Временные сложности следующие:

  • Pop last O(1)
  • Удалить элемент O(n)
  • Установить срез O(k+n)

Экспериментальное исследование

import time

all_t = 0.
for i in range(1000):
    list_ = [i for i in range(100000)]
    start_ = time.time()
    list_.pop()
    all_t += time.time() - start_
print("Average Time for POP is {}".format(all_t/1000.))

all_t = 0.
for i in range(1000):
    list_ = [i for i in range(100000)]
    start_ = time.time()
    del list_[-1]
    all_t += time.time() - start_
print("Average Time for DEL is {}".format(all_t/1000.))

all_t = 0.
for i in range(1000):
    list_ = [i for i in range(100000)]
    start_ = time.time()
    list_ = list_[:-1]
    all_t += time.time() - start_
print("Average Time for SLICE is {}".format(all_t/1000.))

Результаты

Average Time for POP is 7.793903350830078e-07
Average Time for DEL is 9.80854034423828e-07
Average Time for SLICE is 0.0006206443309783935

Краткое описание

pop() - самый быстрый, если вы не указали индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...