Right. I was too fast. There is some speedup due to the string specialization. I'll post a patch to SF with some more tweaks of this implementation. Briefly:
- do not call PyErr_Clear() systematically after PyObject_Compare(); only if (!error_restore && PyErr_Occurred())
What do you mean? The lookdict code checked in already checks PyErr_Occurrs().
- defer variable initializations after common return cases - avoid using more vars in lookdict_string + specialize string_compare() - inline the most frequest case in PyDict_GetItem (the first item probe)
Cool.
Hm. Question: is it possible for the thread state to swap during PyObject_Compare()? If it is possible, things are more complicated than I thought...
Doesn't matter -- it will always swap back. It's tied to the interpreter lock. Now, for truly devious code dealing with the lock and thread state, see the changes to _PyPclose() that Tim Peters just checked in... --Guido van Rossum (home page: http://www.pythonlabs.com/~guido/)