Construct LocalVariableDeletion

Performance Diagrams

Construct LocalVariableDeletion 00100001000020000200003000030000400004000050000500006000060000700007000080000800009000090000100000100000CPython 3.10Nuitka (main)Nuitka (develop)Nuitka (factory)1450590.625468.35997150144567CPython 3.10100248246.875257.0Nuitka (main)100016403.125257.57188940657943Nuitka (develop)100039559.375257.5151934740306Nuitka (factory)Construct LocalVariableDeletionTicks Construct LocalVariableDeletion 00100001000020000200003000030000400004000050000500006000060000700007000080000800009000090000100000100000CPython 3.8Nuitka (main)Nuitka (develop)Nuitka (factory)1157390.625475.565826393987CPython 3.8100172246.875257.0Nuitka (main)99888403.125257.70060265573983Nuitka (develop)99866559.375257.75487469245206Nuitka (factory)Construct LocalVariableDeletionTicks Construct LocalVariableDeletion 00100001000020000200003000030000400004000050000500006000060000700007000080000800009000090000100000100000CPython 2.7Nuitka (main)Nuitka (develop)Nuitka (factory)795890.625484.4499423076923CPython 2.7100000246.875257.0Nuitka (main)100000403.125257.0Nuitka (develop)100000559.375257.0Nuitka (factory)Construct LocalVariableDeletionTicks

Source Code with Construct

import itertools

module_value1 = 1000
module_value2 = None
module_value3 = None


def calledRepeatedly():
    # Force frame and eliminate forward propagation (currently).
    module_value1

    local_value = module_value1

    # Use writing to global variable as access method.
    global module_value2, module_value3

    module_value2 = local_value

    if module_value2 is None:
        # construct_begin
        del local_value
        # construct_end

        another_local_value = module_value3

    module_value2 = module_value1

    local_value = module_value3
    return local_value


for x in itertools.repeat(None, 50000):
    calledRepeatedly()

print("OK.")

Source Code without Construct

import itertools

module_value1 = 1000
module_value2 = None
module_value3 = None


def calledRepeatedly():
    # Force frame and eliminate forward propagation (currently).
    module_value1

    local_value = module_value1

    # Use writing to global variable as access method.
    global module_value2, module_value3

    module_value2 = local_value

    if module_value2 is None:
        # construct_begin



        another_local_value = module_value3

    module_value2 = module_value1

    local_value = module_value3
    return local_value


for x in itertools.repeat(None, 50000):
    calledRepeatedly()

print("OK.")

Context Diff of Source Code


Construct
Baseline
35 35
36     module_value2 = local_value 36     module_value2 = local_value
37 37
38     if module_value2 is None: 38     if module_value2 is None:
39         # construct_begin 39         # construct_begin
t 40         del local_value t 40  
41         # construct_end 41  
42 42
43         another_local_value = module_value3 43         another_local_value = module_value3
44 44
45     module_value2 = module_value1 45     module_value2 = module_value1
46 46

Context Diff of Generated Code


Construct
Baseline
212         } else { 212         } else {
213             goto branch_no_1; 213             goto branch_no_1;
214         } 214         }
215     } 215     }
216     branch_yes_1:; 216     branch_yes_1:;
n 217     CHECK_OBJECT(var_local_value); n
218     Py_DECREF(var_local_value);
219     var_local_value = NULL;
220  
221     { 217     {
222         PyObject *tmp_assign_source_3; 218         PyObject *tmp_assign_source_3;
223         tmp_assign_source_3 = GET_STRING_DICT_VALUE(moduledict___main__, (Nuitka_StringObject *)mod_consts[2]); 219         tmp_assign_source_3 = GET_STRING_DICT_VALUE(moduledict___main__, (Nuitka_StringObject *)mod_consts[2]);
224 220
225         if (unlikely(tmp_assign_source_3 == NULL)) { 221         if (unlikely(tmp_assign_source_3 == NULL)) {
279             type_description_1 = "oo"; 275             type_description_1 = "oo";
280             goto frame_exception_exit_1; 276             goto frame_exception_exit_1;
281         } 277         }
282         { 278         {
283             PyObject *old = var_local_value; 279             PyObject *old = var_local_value;
n n 280             assert(old != NULL);
284             var_local_value = tmp_assign_source_5; 281             var_local_value = tmp_assign_source_5;
285             Py_INCREF(var_local_value); 282             Py_INCREF(var_local_value);
t 286             Py_XDECREF(old); t 283             Py_DECREF(old);
287         } 284         }
288 285
289     } 286     }
290 287
291 288