[issue47221] Bug or bad performance

Cezary Wagner report at bugs.python.org
Mon Apr 4 18:21:34 EDT 2022


Cezary Wagner <cezary.wagner at gmail.com> added the comment:

Some more experiments:

import dis
import timeit

REPEATS = 100


def test1():
    selected = []
    for i in range(REPEATS):
        if i >= 25 and i <= 75:
            selected.append(i)
    return selected


def test2():
    selected = []
    for i in range(REPEATS):
        if 25 <= i <= 75:
            selected.append(i)
    return selected


def test3():
    return [x for x in range(REPEATS) if x >= 25 and x <= 75]


def test4():
    return [x for x in range(REPEATS) if 25 <= x <= 75]


def test(f):
    print(dis.dis(f.__code__.co_code))
    print(timeit.timeit(f))


test(test1)
test(test2)
test(test3)
test(test4)

Result:

          0 BUILD_LIST               0
          2 STORE_FAST               0 (0)
          4 LOAD_GLOBAL              0 (0)
          6 LOAD_GLOBAL              1 (1)
          8 CALL_FUNCTION            1
         10 GET_ITER
    >>   12 FOR_ITER                15 (to 44)
         14 STORE_FAST               1 (1)
         16 LOAD_FAST                1 (1)
         18 LOAD_CONST               1 (1)
         20 COMPARE_OP               5 (>=)
         22 POP_JUMP_IF_FALSE       21 (to 42)
         24 LOAD_FAST                1 (1)
         26 LOAD_CONST               2 (2)
         28 COMPARE_OP               1 (<=)
         30 POP_JUMP_IF_FALSE       21 (to 42)
         32 LOAD_FAST                0 (0)
         34 LOAD_METHOD              2 (2)
         36 LOAD_FAST                1 (1)
         38 CALL_METHOD              1
         40 POP_TOP
    >>   42 JUMP_ABSOLUTE            6 (to 12)
    >>   44 LOAD_FAST                0 (0)
         46 RETURN_VALUE
None
4.565677999999025
          0 BUILD_LIST               0
          2 STORE_FAST               0 (0)
          4 LOAD_GLOBAL              0 (0)
          6 LOAD_GLOBAL              1 (1)
          8 CALL_FUNCTION            1
         10 GET_ITER
    >>   12 FOR_ITER                19 (to 52)
         14 STORE_FAST               1 (1)
         16 LOAD_CONST               1 (1)
         18 LOAD_FAST                1 (1)
         20 DUP_TOP
         22 ROT_THREE
         24 COMPARE_OP               1 (<=)
         26 POP_JUMP_IF_FALSE       18 (to 36)
         28 LOAD_CONST               2 (2)
         30 COMPARE_OP               1 (<=)
         32 POP_JUMP_IF_FALSE       25 (to 50)
         34 JUMP_FORWARD             2 (to 40)
    >>   36 POP_TOP
         38 JUMP_ABSOLUTE            6 (to 12)
    >>   40 LOAD_FAST                0 (0)
         42 LOAD_METHOD              2 (2)
         44 LOAD_FAST                1 (1)
         46 CALL_METHOD              1
         48 POP_TOP
    >>   50 JUMP_ABSOLUTE            6 (to 12)
    >>   52 LOAD_FAST                0 (0)
         54 RETURN_VALUE
None
5.6398234000007506
          0 LOAD_CONST               1 (1)
          2 LOAD_CONST               2 (2)
          4 MAKE_FUNCTION            0
          6 LOAD_GLOBAL              0 (0)
          8 LOAD_GLOBAL              1 (1)
         10 CALL_FUNCTION            1
         12 GET_ITER
         14 CALL_FUNCTION            1
         16 RETURN_VALUE
None
3.8792907999959425
          0 LOAD_CONST               1 (1)
          2 LOAD_CONST               2 (2)
          4 MAKE_FUNCTION            0
          6 LOAD_GLOBAL              0 (0)
          8 LOAD_GLOBAL              1 (1)
         10 CALL_FUNCTION            1
         12 GET_ITER
         14 CALL_FUNCTION            1
         16 RETURN_VALUE
None
3.8591266999937943

----------

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue47221>
_______________________________________


More information about the Python-bugs-list mailing list