[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