On Thursday 19 April 2007, Bill Jackson wrote: > Martin v. Löwis wrote the following on 04/19/2007 02:43 PM: > > Bill Jackson schrieb: > >> I have a dictionary of dictionaries where the keys are typically very > >> long tuples and repeated in each inner dictionary. > > > > What I don't understand here: you say the keys are tuples, yet later, > > you show that the keys are strings. Which one is it? > > Sorry, I was just lazy. The keys will always be tuples...tuple of > strings, tuples of numbers, tuples of objects....simply tuples.
That'll change things a bit because intern only works with strings. Of course, It's not so big a deal, but you will have to put together a class to implement interning. I wrote one for fun: class ITuple(tuple): _interns={} def __new__(cls, tup): if tup not in cls._interns: itup=tuple.__new__(cls, tup) cls._interns[tup]=itup return cls._interns[tup] def __init__(self, *args): #Prevent multiple calls to __init__ if hasattr(self, "_inited"): return tuple.__init__(self, *args) self._inited=True def __eq__(self, o): #If the other is an ITuple, self==o iff self is o if isinstance(o, ITuple): return self is o return tuple.__eq__(self, o) >>> t1=(1,2,3,4); t2=(1,2,3,4) >>> ti1=ITuple(t1); ti2=ITuple(t2) >>> print t1==t2, t1 is t2 True False >>> print ti1==ti2, ti1 is ti2 True True That seems to work. Something to note is that the call overhead of the __eq__ function is large enough that unless you have a slow comparing tuple, comparisons will be faster without it. Comparisons are fast if they are done internally; so between builtin objects or identical (" is ") objects. For an example, suppose you have: class TTT(object): def __eq__(self, o): return True a,b=TTT(),TTT() Then the follow comparisons are fast: (1,2,3)==(1,2,3) (1,2,3,a)==(1,2,3,a) (0,0,0,a)==(1,2,3,b) The following are slow: (1,2,3,a)==(1,2,3,b) Note that the only slow case is the one where a.__eq__(b) is called. However, a.__eq__(b) is assumed True is "a is b" is True. So chances are you'll want to comment out the __eq__ function. -- http://mail.python.org/mailman/listinfo/python-list