Splitting lists

Steven Taschuk staschuk at telusplanet.net
Thu Feb 27 21:14:38 CET 2003


Quoth Létezõ:
> Thanks to Steven for the performance analysis and Alex & Duncan for the
> their more impressive solutions. It would be interesting to insert the new
> "impressive" solutions into the performace test loop. Which is the fastest?

Short and long list trials:

    viktor1           9.56   9.17
    viktor2           8.60   8.30
    viktor2lookup     6.00   5.72
    viktor3          12.08  14.19
    duncan            8.70   8.49
    duncanlookup      6.04   5.76
    alex              6.47   6.18

(The difference between viktor2lookup and duncanlookup is within
experimental error.  Other differences are significant.)

Code follows, so you can see how to do this yourself.

import time

def viktor1(lst, condition):
	tl = [e for e in lst if condition(e)]
	fl = [e for e in lst if not condition(e)]
	return tl, fl

def viktor2(lst, condition):
	tl = []
	fl = []
	for e in lst:
		if condition(e):
			tl.append(e)
		else:
			fl.append(e)
	return tl, fl

def viktor2lookup(lst, condition):
	tl=[]
	fl=[]
	addt = tl.append
	addf = fl.append
	for e in lst:
		if condition(e):
			addt(e)
		else:
			addf(e)
	return tl, fl

def viktor3(lst, condition):
	cl = [(e, condition(e)) for e in lst]
	tl = [e[0] for e in cl if e[1]]
	fl = [e[0] for e in cl if not e[1]]
	return tl, fl

def duncan(lst, condition):
	fl = []
	tl = [x for x in lst if condition(x) or fl.append(x)]
	return tl, fl

def duncanlookup(lst, condition):
	fl = []
	addf = fl.append
	tl = [x for x in lst if condition(x) or addf(x)]
	return tl, fl

def alex(lst, condition):
	tl = []
	fl = []
	appenders = tl.append, fl.append
	for e in lst:
		appenders[not condition(e)](e)
	return tl, fl

def timetrial(splitfunc, condition, listsize, iterations):
	lst = range(listsize)
	start = time.clock()
	for i in range(iterations):
		splitfunc(lst, condition)
	end = time.clock()
	return end - start

if __name__ == '__main__':
	for f in (viktor1, viktor2, viktor2lookup,
			viktor3, duncan, duncanlookup, alex):
		print '%-15s %6.2f %6.2f' % (f.__name__,
			timetrial(f, lambda x: x < 5, 100, 5000),
			timetrial(f, lambda x: x < 5, 5000, 100))


-- 
Steven Taschuk                                                   w_w
staschuk at telusplanet.net                                      ,-= U
                                                               1 1





More information about the Python-list mailing list