[Pyrex] [Cython] switch statement
Robert Bradshaw
robertwb at math.washington.edu
Fri Mar 14 08:05:15 CET 2008
On Mar 13, 2008, at 1:55 AM, Stefan Behnel wrote:
> Hi,
>
> Robert Bradshaw top-posted:
>> On Mar 12, 2008, at 11:32 AM, Simon Burton wrote:
>>> Does anyone know if gcc can optimise a switch done with nested if's
>>> as well as it optimises a real switch ? (eg. using computed-gotos)
>>
>> I did some experiments with this, and the results seemed to indicate
>> it does not. Also, nested ifs performed poorly compared to a flat
>> list of ifs (for a medium-sized (5-50) set of conditions).
>
> Interesting. Does that also hold for boolean "and/or" expressions?
> Cython
> translates those to nested ifs. (I guess that's difficult to
> compare, though,
> as it short-circuits.)
The thing about Cython's nested ifs is that (in Python) the cost of
evaluating the truth statement is non-trivial (e.g. a function call
at least), so short-circuits are nearly always a gain. Because the
statements may have side effects, this is mandatory to enforce.
>> It would be nice to have some syntax for switch statements. Several
>> alternatives have been rejected for Python: http://www.python.org/
>> dev/
>> peps/pep-3103/
>
> That's because they have Python semantics, not C semantics.
> Python's language
> semantics make it a bit harder to come up with a meaningful
> "switch" design
> than a plain C language "check this integer value against a list of
> other
> integers" switch statement.
>
> Regarding syntax: my opinion on this is that we should just do
> without any new
> syntax, take our cool plugin optimiser infrastructure and just
> replace the
> most obvious
>
> if c_int_val == 1:
> code1()
> elif c_int_val == 2:
> code2()
> elif c_int_val == some_other_constant_c_int:
> code3()
> else:
> code4()
>
> by a straight C switch statement. No special casing if it involves
> variable
> values, Python values, or otherwise non compile-time known values
> (i.e. DEF is
> allowed), or any other comparison operators than "==". Just an
> optimisation
> for the most simple case that a C switch statement can handle:
>
> - if-elif-else chain with exactly one operator at each step: '=='
> -> decidable right after parsing (or even in the parser)
> - lhs always the same plain C integer variable
> -> "same name" decidable right after parsing, "type" after type
> annalysis
> - rhs a compile-time constant C integer value
> -> "type" decidable after type annalysis
>
> This should be easy and fast enough to decide.
>
> That way, people can decide what trade-off between Python semantics
> and
> optimisation they want. And if we find more cases that we can
> support, we can
> improve the plugin instead of the syntax.
Dag Sverre wrote a similar writeup: http://wiki.cython.org/
enhancements/switch . I think it's a good idea. For small lists the
savings will be minimal, but for larger ones there can be significant
gains.
- Robert
More information about the Pyrex
mailing list