[python] Modifikace seznamu bez kopirovnani (bylo SQLite - forma selectovaných dat)

Jan Matejka matejka na cat.cz
Pondělí Leden 8 10:21:30 CET 2007


> Obávám se, ale že ten můj kód, tedy první verze bude rychlejší.

Nevěřil jsem, zkusil jsem:

1)
for v,i in enumerate(l1):
    l1[i]=v+1
6.17100000381

2)
for i in xrange(len(l1)):
    l1[i]=l1[i]+1
4.8599998951

3)
for v in l1:
    s=s+v
3.6400001049

4)
for i in xrange(len(l1)):
    s=s+l1[i]
4.75

Z testu plyne, že pokud stačí read-only přístup k enumerovanému objektu tak
je rychlejší přístup bez indexu 3 než přes index 4.

V této souvislosti je zajímavé, že pro read-write je pomalejší varianta 1
než 2. Myslím, že je to způsobeno použitím dvou proměnných místo jedné, nebo
malou optimalizací enumerate.


skript:
import time
n=10000000
l1=[0]*n

t0=time.time()
for v,i in enumerate(l1):
    l1[i]=v+1
print """for v,i in enumerate(l1):
    l1[i]=v+1
""", time.time()-t0

t0=time.time()
for i in xrange(len(l1)):
    l1[i]=l1[i]+1
print """
for i in xrange(len(l1)):
    l1[i]=l1[i]+1
""",time.time()-t0

s=0
t0=time.time()
for v in l1:
    s=s+v
print  """
for v in l1:
    s=s+v
""",time.time()-t0

s=0
t0=time.time()
for i in xrange(len(l1)):
    s=s+l1[i]
print  """
for i in xrange(len(l1)):
    s=s+l1[i]
""",time.time()-t0



skript:
import time
n=10000000
l1=[0]*n

t0=time.time()
for v,i in enumerate(l1):
    l1[i]=v+1
print """for v,i in enumerate(l1):
    l1[i]=v+1
""", time.time()-t0

t0=time.time()
for i in xrange(len(l1)):
    l1[i]=l1[i]+1
print """
for i in xrange(len(l1)):
    l1[i]=l1[i]+1
""",time.time()-t0

s=0
t0=time.time()
for v in l1:
    s=s+v
print  """
for v in l1:
    s=s+v
""",time.time()-t0

s=0
t0=time.time()
for i in xrange(len(l1)):
    s=s+l1[i]
print  """
for i in xrange(len(l1)):
    s=s+l1[i]
""",time.time()-t0




Další informace o konferenci Python