[Python-es] L[:] vs L*1
Hernan Martinez Foffani
hernan en orgmf.com.ar
Mar Ago 20 15:05:10 CEST 2002
Había sugerido en respuesta a un mensaje de Chema que
quizás el uso de L[:] en vez de L*1 para copiar una
lista se debía a un tema de velocidad.
Como es mejor medir que especular hice unas pruebas.
El resultado es que L*1 es un 25% mas rapido que L[:]!
El porcentaje varia pero L*1 es siempre mas rapido
que L[:] en cualquier condición de tamaño de la lista,
parametros de optimizacion, entorno, etc.
Use python 2.2.1 en W2K y en Linux.
Les mando los resultados y el programita de prueba.
La pregunta de Chema de por qué L[:] es la forma mas
conocida sigue en pie.
-Hernan
nota: la columna len(L) muestra en realidad la cuarta
parte del tamaño de la lista.
------------ Windows 2000 -------------
C:>c:\python22\python lis.py
len(L) count L[:] L*1 %diff
50 1000 0.009 0.007 -21
100 1000 0.015 0.012 -20
500 1000 0.072 0.058 -19
1000 1000 0.143 0.113 -20
50 10000 0.084 0.070 -16
100 10000 0.153 0.126 -17
500 10000 0.719 0.580 -19
1000 10000 1.420 1.140 -19
50 100000 0.832 0.712 -14
100 100000 1.553 1.259 -18
500 100000 7.165 5.807 -18
1000 100000 14.180 11.350 -19
C:\>c:\python22\python -OO lis.py
len(L) count L[:] L*1 %diff
50 1000 0.009 0.007 -25
100 1000 0.016 0.014 -12
500 1000 0.071 0.057 -18
1000 1000 0.142 0.115 -19
50 10000 0.085 0.070 -17
100 10000 0.155 0.124 -19
500 10000 0.720 0.575 -20
1000 10000 1.428 1.146 -19
50 100000 0.841 0.717 -14
100 100000 1.568 1.335 -14
500 100000 7.155 5.761 -19
1000 100000 14.139 11.409 -19
C:\>
--------- Suse 7.1 Linux 2.2.18
hernan en condor:~ > python lis.py
len(L) count L[:] L*1 %diff
50 1000 0.020 0.000 -100
100 1000 0.020 0.010 -49
500 1000 0.070 0.050 -28
1000 1000 0.140 0.090 -35
50 10000 0.080 0.070 -12
100 10000 0.150 0.110 -26
500 10000 0.680 0.490 -27
1000 10000 1.350 0.960 -28
50 100000 0.890 0.690 -22
100 100000 1.540 1.140 -25
500 100000 6.890 4.930 -28
1000 100000 13.550 9.610 -29
hernan en condor:~ > python -OO lis.py
len(L) count L[:] L*1 %diff
50 1000 0.010 0.010 0
100 1000 0.020 0.010 -50
500 1000 0.070 0.050 -28
1000 1000 0.130 0.110 -15
50 10000 0.090 0.080 -11
100 10000 0.150 0.120 -20
500 10000 0.710 0.490 -30
1000 10000 1.360 0.970 -28
50 100000 0.880 0.710 -19
100 100000 1.550 1.130 -27
500 100000 6.880 4.920 -28
1000 100000 13.550 9.660 -28
hernan en condor:~ >
----------- lis.py ----------------
import time
print "len(L) count L[:] L*1 %diff "
for count in [1000, 10000, 100000]:
t8 = time.clock()
for i in xrange(count):
pass
t9 = time.clock()
tloop = t9 - t8
for length in [50, 100, 500, 1000]:
L = ["1xxxxx", 5000, 40.40, ("33","44")] * length
s = L
t1 = time.clock()
for i in xrange(count):
s = L[:]
t2 = time.clock()
t3 = time.clock()
for i in xrange(count):
s = L * 1
t4 = time.clock()
tslice = t2-t1 - tloop
tmult1 = t4-t3 - tloop
print " %4d %6d %6.3f %6.3f %3d" % \
(length, count, tslice, tmult1, \
((tmult1-tslice)/tslice)*100)
-------------------------------
Más información sobre la lista de distribución Python-es