Re:Python Practices for Efficient Code: Performance, Memory,...
by pfranz on Friday August 18, 2017 @10:04PM
(#15051222)
That's what I was trying to get at. Not to avoid exceptions, but to write your code in such a way that exceptions are rare. I usually encounter it with file i/o situations, like like you're saying, an extra file stat in a loop would be really slow and open you to race conditions (file being modified before testing an acting). If an exception was thrown 90% of the time, you want to rethink your logic because performance might be equally poor. Catching the rare exception is ideal.
As an aside (since you mentioned generators), I wish exception handling in comprehensions were easier to deal with.
Re:Python Practices for Efficient Code: Performance, Memory,...
by TFortunato on Friday August 18, 2017 @03:42PM
(#15049136)
Out of curiosity, is there any overhead to the python exception mechanism if you don't hit an exception (ie just by wrapping things in a try block)
I come from an embedded background, where in some c++ projects, we would disable exceptions for various reasons, including the memory overhead, which is why I ask..
Re:Python Practices for Efficient Code: Performance, Memory,...
by dom0 on Friday August 18, 2017 @05:24PM
(#15049834)
Exception handlers in CPython work by having an instruction store the offset to the start of the handler code which is stored on a stack attached to the frame (iirc). So the cost of a "try:" block is pretty low (for Python, anyway).
The handlers themselves are pretty basic, an "except SomeError" pretty much translates to "if isinstance(exc, SomeError):".
That really depends on your hit rate. Say you have a generator returning objects and you don't know if they have an attribute. You can use hasattr(..) to check or just try to use the attribute and catch the AttributeError.
One-on-one the exception is slower, but there comes a point where the exception is rare enough that actively checking every single item is slower. Eg if only 1-in-1000 doesn't have the attribute, just mop up with an exception.