Deleting the first element of a list
Chad Netzer
cnetzer at mail.arc.nasa.gov
Thu Oct 3 17:30:07 EDT 2002
On Wednesday 02 October 2002 21:26, Bruce Dawson wrote:
>
> Highly applicable to this thread. Deleting the first item of a Python
> list or C++ vector is an O(n) operation - proportional to the number
> of items in the list. If you do that for every item in the list it is
> O(n^2) - proportional to the square.
Just for fun, I wrote this up:
N = 17
M = 5
for n in xrange(4,N):
m = 5
avg = 0
for j in xrange( M ):
l = range( 2**n )
start = time.time()
for i in xrange( 2**(n-3) ):
del l[ 0 ]
del l[ 0 ]
del l[ 0 ]
del l[ 0 ]
del l[ 0 ]
del l[ 0 ]
del l[ 0 ]
del l[ 0 ]
end = time.time()
avg = avg + (end - start)
avg = avg / m
print "avg time to delete list of length %10d: %.13f secs" % (2**n,
avg)
Here are the results on my machine:
avg time to delete list of length 16: 0.0000482082367 secs
avg time to delete list of length 32: 0.0000820159912 secs
avg time to delete list of length 64: 0.0001710176468 secs
avg time to delete list of length 128: 0.0003101825714 secs
avg time to delete list of length 256: 0.0006976127625 secs
avg time to delete list of length 512: 0.0017696142197 secs
avg time to delete list of length 1024: 0.0053425788879 secs
avg time to delete list of length 2048: 0.0166998147964 secs
avg time to delete list of length 4096: 0.0555817842484 secs
avg time to delete list of length 8192: 0.2105991840363 secs
avg time to delete list of length 16384: 0.9571284055710 secs
avg time to delete list of length 32768: 3.1392956018448 secs
avg time to delete list of length 65536: 25.6988666057587 secs
The last line I think shows the some effects of cache thrashing (but
not swapping; I have 1 Gig of RAM). It also illustrates each doubling
of the problem set increases the running time by a factor of 4 or more
(ie. ~ O( N^2 ) growth, at least when the lists start to get long (ie.
> 512 items or so)
And if I change the 'del l[ 0 ]' to 'del l[ -1 ]':
avg time to delete list of length 16: 0.0000484228134 secs
avg time to delete list of length 32: 0.0000805854797 secs
avg time to delete list of length 64: 0.0001428127289 secs
avg time to delete list of length 128: 0.0002708435059 secs
avg time to delete list of length 256: 0.0005234003067 secs
avg time to delete list of length 512: 0.0010224103928 secs
avg time to delete list of length 1024: 0.0020072221756 secs
avg time to delete list of length 2048: 0.0040839672089 secs
avg time to delete list of length 4096: 0.0080970048904 secs
avg time to delete list of length 8192: 0.0164772510529 secs
avg time to delete list of length 16384: 0.0334905624390 secs
avg time to delete list of length 32768: 0.0808611869812 secs
avg time to delete list of length 65536: 0.1617539882660 secs
Here a doubling of list length leads more or less to a doubling of
running time (ie. O( N )).
So, no real surprises, but illustrative for those who have never
compared O( N^2 ) to O( N ) algorithms before (hmmm, maybe that should
be phi( N ) or even o( N )? ) I didn't dare do a longer list for 'del
l[ 0 ]', whereas 'del l[ -1 ]' scales easily to much longer lists.
--
Chad Netzer
cnetzer at mail.arc.nasa.gov
More information about the Python-list
mailing list