Benchmark [was Re: common problem - elegant solution sought]

2008-01-15 Thread Helmut Jarausch
Again, many thanks to all who provide their solution.
I have timed these (though on my old P3(0.9GHz)) - see below
Helmut.

Helmut Jarausch wrote:
 Hi,
 
 I'm looking for an elegant solution of the following tiny but common 
 problem.
 
 I have a list of tuples  (Unique_ID,Date) both of which are strings.
 I want to delete the tuple (element) with a given Unique_ID, but
 I don't known the corresponding Date.
 

#!/usr/bin/python

import random
import timeit

Lorg=[]

def genList(L) :
   for f in range(ord('A'),ord('z')+1) :
 for s in range(ord('A'),ord('z')+1) :
   L.append((chr(f)+chr(s),str(random.randrange(0,100

genList(Lorg)
Times= 1000
T0= timeit.Timer('L=list(Lorg)','from __main__ import Lorg').timeit(Times)
print T0

SetUp1=r'''from __main__ import Lorg
def del_by_key(L,key) :
   d= dict(L)
   del d[key]
   L[:]= d.items()
'''

SetUp2=r'''from __main__ import Lorg
def del_by_key(L,key) :
   d= dict(L)
   t= (key,d[key])
   L.remove(t)
'''

SetUp3=r'''from __main__ import Lorg
def del_by_key(L,key) :
   index= [k for k,val in L]
   pos  = index.index(key)
   del L[pos]
'''

SetUp4=r'''from __main__ import Lorg
def del_by_key(L,key) :
   for pos, (k,d) in enumerate(L):
 if  k == key :
   del L[pos]
   break
'''

SetUp5=r'''from __main__ import Lorg
def del_by_key(L,key) :
   L[:]= [(k,d) for (k,d) in L if k !=key]
'''

SetUp6=r'''from __main__ import Lorg
class Tester(object) :
   def __init__(self,key) :
 self.key= key
   def __eq__(self,other) :
 return other[0] == self.key

def del_by_key(L,key) :
   del L[L.index(Tester(key))]
'''

print '*** ready ***'


T= timeit.Timer(L=list(Lorg);del_by_key(L,'Zz'),SetUp1).timeit(Times)
print Method 1 :,T-T0

T= timeit.Timer(L=list(Lorg);del_by_key(L,'Zz'),SetUp2).timeit(Times)
print Method 2 :,T-T0

T= timeit.Timer(L=list(Lorg);del_by_key(L,'Zz'),SetUp3).timeit(Times)
print Method 3 :,T-T0

T= timeit.Timer(L=list(Lorg);del_by_key(L,'Zz'),SetUp4).timeit(Times)
print Method 4 :,T-T0

T= timeit.Timer(L=list(Lorg);del_by_key(L,'Zz'),SetUp5).timeit(Times)
print Method 5 :,T-T0

T= timeit.Timer(L=list(Lorg);del_by_key(L,'Zz'),SetUp6).timeit(Times)
print Method 6 :,T-T0

# Results on an old P3 (0.9 GHz)
# *** ready ***
# Method 1 : 10.9850928783
# Method 2 : 5.96455168724
# Method 3 : 3.97821164131
# Method 4 : 1.66151881218
# Method 5 : 8.90886187553
# Method 6 : 6.2503888607


The clear winner is

def del_by_key(L,key) :
   for pos, (k,d) in enumerate(L):
 if  k == key :
   del L[pos]
   break


-- 
Helmut Jarausch

Lehrstuhl fuer Numerische Mathematik
RWTH - Aachen University
D 52056 Aachen, Germany
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Benchmark [was Re: common problem - elegant solution sought]

2008-01-15 Thread bearophileHUGS
Helmut Jarausch:
 The clear winner is

 def del_by_key(L,key) :
for pos, (k,d) in enumerate(L):
  if  k == key :
del L[pos]
break

If you use Psyco this is faster:

def del_by_key(L,key):
   pos = 0
   for pair in L:
 if  pair[0] == key :
   del L[pos]
   break
 pos += 1

Bye,
bearophile
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Benchmark [was Re: common problem - elegant solution sought]

2008-01-15 Thread Paul Rubin
Helmut Jarausch [EMAIL PROTECTED] writes:
 def del_by_key(L,key) :
for pos, (k,d) in enumerate(L):
  if  k == key :
del L[pos]
break

This looks very dangerous, mutating L while iterating over it.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Benchmark [was Re: common problem - elegant solution sought]

2008-01-15 Thread Helmut Jarausch
Paul Rubin wrote:
 Helmut Jarausch [EMAIL PROTECTED] writes:
 def del_by_key(L,key) :
for pos, (k,d) in enumerate(L):
  if  k == key :
del L[pos]
break
 
 This looks very dangerous, mutating L while iterating over it.

No, as Bruno Desthuilliers has pointed out, because one
breaks out of the loop immediately.

Helmut.

-- 
Helmut Jarausch

Lehrstuhl fuer Numerische Mathematik
RWTH - Aachen University
D 52056 Aachen, Germany
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Benchmark [was Re: common problem - elegant solution sought]

2008-01-15 Thread [EMAIL PROTECTED]
On Jan 15, 6:18 pm, Paul Rubin http://[EMAIL PROTECTED] wrote:
 Helmut Jarausch [EMAIL PROTECTED] writes:
  def del_by_key(L,key) :
 for pos, (k,d) in enumerate(L):
   if  k == key :
 del L[pos]
 break

 This looks very dangerous, mutating L while iterating over it.

This would indeed be dangerous *without* the break statement !-)
-- 
http://mail.python.org/mailman/listinfo/python-list