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