Search code examples
pythonperformanceif-statementoptimizationcomparison

Is a comparison or if statement faster


Would doing the following be faster or slower than just an if statement?

mult = x or y 
# Assuming python considers something 
# being "0" as false and something being 1 or higher 
# (or -1 and lower) as true

mult = (x/x) or (y/y) 
# This is in the case Python doesn't do what was
# described above

draw(x, y, 0, 255, 0, 255*mult)
# draw(x_pos, y_pos, red, green, blue, alpha)

Not sure how to word this better, let alone if wording it better is necessary. Just something I am curious about as I was talking about optimizing code for performance, and such an idea had come to me but wasn't sure about since Google wasn't providing any helpful results (all were unrelated).

I probably could test this in my own time too, but I feel as if asking someone who would know how computers would work with comparisons vs if statements could be the most helpful.


Solution

  • Python converts its operators into method calls. It doesn't know what any of them actually do. The exact rules can get complicated, but more or less, mult = x or y turns into

    mult = x.__bool__() or y.__bool__()
    

    x and y decide what bool means to them and return True or False accordingly. For integers, 0 is False, everything else is True. or short-circuits so if x is True, the y method call is not made.

    mult = (x/x) or (y/y) turns into something like

    mult = x.__div__(x).__bool__() or y.__div__(y).__bool__()
    

    x/x will almost aways be 1 (at least for integers) but python doesn't know that. It needs to make the extra div call. That makes it slower. It would be faster to write this as mult = 1 or 1, or even better, mult = 1. The exception is when a value is 0 as you would get a ZeroDivisionError.

    draw(x, y, 0, 255, 0, 255*mult) vs draw(x_pos, y_pos, red, green, blue, alpha)

    The first uses literals which are a bit faster than looking up and reading the variables red, etc... But it has the cost of the multiplication. 1 will be trivially faster.

    None of these different ways of doing things will make a real difference to the execution of the code IMHO. Its all a bit of white noise.