efficiency question

Fredrik Lundh fredrik at pythonware.com
Fri Jun 30 07:13:55 EDT 2006


David Harvey wrote:

> Suppose I write
>
> if x in ("abc", "def", "xyz"):
> doStuff()
>
> elif x in ("pqr", "tuv", "123"):
> doOtherStuff()
>
> elif ...
> When is python building the tuples? Does it need to build the tuple
> every time it comes through this code? Or does it somehow recognise
> that they are constant and cache them?

when in doubt, ask the compiler:

def code(x):
    if x in ("abc", "def", "xyz"):
        doStuff()
    elif x in ("pqr", "tuv", "123"):
        doOtherStuff()

import dis
dis.dis(code)

prints:

  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               7 (('abc', 'def', 'xyz'))
              6 COMPARE_OP               6 (in)
              9 JUMP_IF_FALSE           11 (to 23)
             12 POP_TOP

  3          13 LOAD_GLOBAL              1 (doStuff)
             16 CALL_FUNCTION            0
             19 POP_TOP
             20 JUMP_FORWARD            25 (to 48)
        >>   23 POP_TOP

  4          24 LOAD_FAST                0 (x)
             27 LOAD_CONST               8 (('pqr', 'tuv', '123'))
             30 COMPARE_OP               6 (in)
             33 JUMP_IF_FALSE           11 (to 47)
             36 POP_TOP

  5          37 LOAD_GLOBAL              2 (doOtherStuff)
             40 CALL_FUNCTION            0
             43 POP_TOP
             44 JUMP_FORWARD             1 (to 48)
        >>   47 POP_TOP
        >>   48 LOAD_CONST               0 (None)
             51 RETURN_VALUE

so the answer is "yes, in this specific case".

> (The tuples I have in mind are of course much longer than three
> elements)

in that case, you should probably use pre-calculated sets instead of tuples.

</F> 






More information about the Python-list mailing list