################ one.py ##############
import array
a = array.array('i')
for x in xrange(10000000):
a.append(x)
for x in a:
a[x] += 1
################ two.py ##############
a = []
for x in xrange(10000000):
a.append(x)
for x in a:
a[x] += 1
######################################
ktops:toby:pytest> time python one.py; time python two.py
real 0m28.116s
user 0m17.504s
sys 0m10.435s
real 0m23.026s
user 0m13.027s
sys 0m9.777s
Perhaps the only advantage is that they take less memory
to store a large number of items? It would seem then, that
'economical' might have been a better choice of word than
'efficient'.
Thanks,
Toby
--
Posted via a free Usenet account from http://www.teranews.com
I get an even bigger difference with this test (same as yours, but
using timeit and using an allegedly more efficient way of initialising
the array)
>>> def test(arr, n):
... a = arr(xrange(n))
... for x in a:
... a[x] += 1
...
>>> n = 10000000
>>> import timeit
>>> timeit.Timer('test(list, n)', 'from __main__ import test, n').timeit(1)
2.4988760948181152
>>> from array import array
>>> arr = lambda n: array('i', n)
>>> timeit.Timer('test(arr, n)', 'from __main__ import test, arr, n').timeit(1)
5.7419960498809814
>>>
--
Arnaud
Bye,
bearophile
Lists are better optimized for appending to the end. Python lists are
implemented as arrays of pointers, with a few empty slots at the
end.
Arrays are contigous memory buffers. They provide faster read-write
access, particularly for chunks of data, but are slower at resizing.
I never use the array module, as NumPy is superior.
I doubt that. AFAIK both arrays and lists are continuous memory-areas,
that double (at least to a certain threshold or so) when reaching the
capacity limit.
lists are of type PyObject* of course, whereas arrays are not, instead
they are of their respective primitive type, making them more memory
efficient.
Diez
For what it's worth, lists over-allocate by ~1/8, and arrays by ~1/16.
(Details in listobject.c:list_resize and arraymodule.c:array_resize.)