Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is the big O of pop() different from pop(0) in python [duplicate]

Shouldn't they both be O(1), as popping an element from any location in a Python list involves destroying that list and creating one at a new memory location?

like image 581
Teererai Marange Avatar asked Jan 06 '16 12:01

Teererai Marange


2 Answers

Python's list implementation uses a dynamically resized C array under the hood, removing elements usually requires you to move elements following after up to prevent gaps.

list.pop() with no arguments removes the last element. Accessing that element can be done in constant time. There are no elements following so nothing needs to be shifted.

list.pop(0) removes the first element. All remaining elements have to be shifted up one step, so that takes O(n) linear time.

like image 59
Martijn Pieters Avatar answered Nov 08 '22 20:11

Martijn Pieters


To add to Martijn's answer, if you want a datastructure that has constant time pops at both ends, look at collections.deque.

like image 44
Daniel Roseman Avatar answered Nov 08 '22 20:11

Daniel Roseman