[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