[Python-ideas] Question about `list.insert`

spir denis.spir at gmail.com
Fri Feb 7 11:37:06 CET 2014


On 02/07/2014 11:14 AM, Ram Rachum wrote:
> Okay, now that I've posted on python-list, and among the 80% of joke posts
> in my thread, there was a 20% of posts that assured me that Python's list
> has no such behavior and that I should use deque, I now ask on
> Python-ideas: Is there a good reason why `list.insert(whatever, 0)` doesn't
> opportunistically try to allocate more space at the left side of the list,
> so as to save the expensive operation of moving all the items? I'm not
> saying it should reserve space there, just check if that space is
> available, and if so use it. Is there any reason why not?

It is not possible, because it would change the pointer (to the actual "stock" 
of items), that must point to the first item, and be also known by the memory 
allocator as such. In principle, one can have a "fake" pointer with some part of 
the data actually positioned *before* the address it points to. This is in fact 
the way "Pascal arrays" (and strings) are commonly implemented, with their sizes 
prefixed to the first item. Bit this introduces some complication (eg one must 
recompute the original pointer for dealloc) and must be designed right from the 
start at the lowest level.

The only practicle way would be to systematically reserve memory space before 
the start item [*], for such cases. It is not worth it for a very specific 
operation like like.insert_anywhere (even less list.insert_at_start), which is 
not (in my view) the proper point of lists (arrays, in fact). We should use 
proper collections whenever we need inserting (and removing) at arbitrary 
locations. 99% lists do not need that. As I see it, lists are for, in order of 
importance:

* put new item (at the end) (also when used as a stack, =push)
* iterate (in order)

* read item (anywhere)
* change item (anywhere)

* take or remove last item (only when used only as a stack, =pop)

The deal may possibly be different if arrays were python's only collection (like 
link lists in lisp or tables in lua).

d

[*] I sometimes wish strings would reserve place for exactly one more code at 
the _end_, for cases when one must ensure a string (often read from file) 
terminates with a newline ;-)


More information about the Python-ideas mailing list