[Cython] Redundant Cython exception message strings
Stefan Behnel
stefan_ml at behnel.de
Sat May 28 00:32:46 CEST 2011
Hi,
I recently stumbled over a tradeoff question with AttributeError, and now
found the same situation for UnboundLocalError in Vitja's control flow
branch. So here it is.
When we raise an exception several times in different parts of the code
with a message that only differs slightly each time (usually something like
"'NoneType' has no attribute X", or "local variable X referenced before
assignment"), we have three choices to handle this:
1) Optimise for speed: create a Python string object at module
initialisation time and call PyErr_SetObject(exc_type, msg_str_obj).
2) Current way: let CPython create the string object when raising the
exception and just call PyErr_SetString(exc_type, "complete message").
3) Trade speed for size and allow the C compiler to reduce the storage
redundancy: write only the message template and the names as C char*
constants by calling PyErr_Format(exc_type, "message template %s", "X").
Assuming that exceptions should be exceptional, I'm leaning towards 3).
This would allow the C compiler to collapse multiple usages of the same C
string into one data constant, thus reducing a bit of redundancy in the
shared library size and the memory footprint. However, it would (slightly?)
slow down the exception raising due to the additional string formatting,
even when compared to the need to build a Python string object that it
shares with 2). While 1) would obviously be the fastest way to raise an
exception (no memory allocation, only refcounting), I think it's not worth
it for exceptions as it increases both the runtime memory overhead and the
module startup time.
Thoughts?
Stefan
More information about the cython-devel
mailing list