Is it possible to sort a dictionary?
Alex Martelli
aleaxit at yahoo.com
Thu Mar 29 07:45:16 EST 2001
"Carel Fellinger" <cfelling at iae.nl> wrote in message
news:99q70i$1le$1 at animus.fel.iae.nl...
[snip]
> I just wonder why the items() method is slooow; values() and keys()
> are both much faster, going over the whole dict indexing from keys()
> is even faster. Is tuple making/unpacking so expensive? Or is a dict
I can't reproduce this observation... here's a datapoint:
D:\>python b.py
sortWithItems: 0.0438600314118
List with 2969 items:
('\012\012 905', 905)
('\012\012 906', 906)
('\012\012 907', 907)
...
('}\012 697', 697)
('}\012 698', 698)
('}\012 699', 699)
sortWithKeys: 0.0460969072614
List with 2969 items:
('\012\012 905', 905)
('\012\012 906', 906)
('\012\012 907', 907)
...
('}\012 697', 697)
('}\012 698', 698)
('}\012 699', 699)
i.e., items() seems a bit _faster_ than keys() then
going over the dict -- with the script b.py being:
import time,sys,pprint
def sortWithItems(adict):
result = adict.items()
result.sort()
return result
def sortWithKeys(adict):
keys = adict.keys()
keys.sort()
return [ (key, adict[key]) for key in keys ]
def timeit(afunc, *someargs):
start = time.clock()
result = afunc(*someargs)
stend = time.clock()
print "%s: %s" % (afunc.__name__, stend-start)
return result
def plist(alist):
print "List with %d items:"%len(alist)
if len(alist)<=7:
for item in alist: print ' ',item
else:
for item in alist[:3]: print ' ',item
print ' ...'
for item in alist[-3:]: print ' ',item
if __name__=='__main__':
adict = {}
sometext=open(sys.argv[0]).read()
for i in range(1,len(sometext)-1):
adict[sometext[i-1:i+2]+str(i)] = i
adict[sometext[i:i+3]+str(i)] = i
adict[sometext[i+1:i+4]+str(i)] = i
result = timeit(sortWithItems, adict)
plist(result)
result = timeit(sortWithKeys, adict)
plist(result)
Alex
More information about the Python-list
mailing list