[Python-3000] inst_persistent_id

Jim Fulton jim at zope.com
Sat Jan 12 18:25:00 CET 2008

Recently, I reviewed the documentation source for pickle and came  
across the following comment:

    BAW: Both pickle and cPickle support something called  
    which appears to give unknown types a second shot at producing a  
    id.  Since Jim Fulton can't remember why it was added or what it's  
for, I'm
    leaving it undocumented.

I couldn't remember this and decided to dig into it and realized that  
this was a very useful experimental feature I added way back when  
cPickle was in its infancy.  This is a fairly useful optimization that  
I never got around to evaluating.  (Yeah, I know.) It is a hook, like  
the persistent_id hook that is called with objects to determine if  
they should be pickled by persistent reference.  Unlike persistent_id,  
it isn't called for built-in types (really types for which pickle has  
specific handlers), like strings, numbers, lists, tuples and so on. It  
is only called for "instances" (types for which pickle doesn't have  
specific handlers).  This vastly reduces the number of calls to the  
hook.  Some tests with ZODB indicated significant improvements in  
pickling speed when a hook is used.

If there are no objections, I'll update the Python 2 documentation to  
describe this and add a test.  The comment above suggests that this  
hook is in pickle and cPickle.  It is in cPickle, but was removed from  
pickle.  I propose to add it back to pickle -- mainly for consistency  
with cPickle.  I'll need to double check how this interacts with the  
type dispatching in pickle protocol 2.

Any objections?


Jim Fulton
Zope Corporation

More information about the Python-3000 mailing list