Construct ClosureVariableAccess

Performance Diagrams

Construct ClosureVariableAccess 00100000010000002000000200000030000003000000400000040000005000000500000060000006000000700000070000008000000800000090000009000000CPython 2.7Nuitka (master)Nuitka (develop)Nuitka (factory)905106689.78846153846155257.0CPython 2.72900163244.59615384615387424.9341152276343Nuitka (master)2900163399.4038461538462424.9341152276343Nuitka (develop)2900175554.2115384615385424.9337875994173Nuitka (factory)Construct ClosureVariableAccessTicks Construct ClosureVariableAccess 001000000100000020000002000000300000030000004000000400000050000005000000600000060000007000000700000080000008000000CPython 3.5Nuitka (master)Nuitka (develop)Nuitka (factory)897331589.78846153846155257.0CPython 3.53450129244.59615384615387409.1025655170144Nuitka (master)3450414399.4038461538462409.0947169254275Nuitka (develop)3450489554.2115384615385409.0926515065889Nuitka (factory)Construct ClosureVariableAccessTicks

Source Code with Construct

module_value1 = 1000
module_value2 = None
module_value3 = None

def calledRepeatedly():
    closure_value = module_value1

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

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

# construct_begin
        module_value2 = closure_value
# construct_end

        module_value3 = closure_value

    f()

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

print("OK.")

Source Code without Construct

module_value1 = 1000
module_value2 = None
module_value3 = None

def calledRepeatedly():
    closure_value = module_value1

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

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

# construct_begin



        module_value3 = closure_value

    f()

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

print("OK.")

Context Diff of Source Code


Construct
Baseline
30 30
31         # Use writing to global variable as access method. 31         # Use writing to global variable as access method.
32         global module_value2, module_value3 32         global module_value2, module_value3
33 33
34 # construct_begin 34 # construct_begin
t 35         module_value2 = closure_value t 35  
36 # construct_end 36  
37 37
38         module_value3 = closure_value 38         module_value3 = closure_value
39 39
40     f() 40     f()
41 41

Context Diff of Generated Code


Construct
Baseline
394             exception_value = PyUnicode_FromFormat("free variable '%s' referenced before assignment in enclosing scope", "closure_value"); 394             exception_value = PyUnicode_FromFormat("free variable '%s' referenced before assignment in enclosing scope", "closure_value");
395             exception_tb = NULL; 395             exception_tb = NULL;
396             NORMALIZE_EXCEPTION(&exception_type, &exception_value, &exception_tb); 396             NORMALIZE_EXCEPTION(&exception_type, &exception_value, &exception_tb);
397             CHAIN_EXCEPTION(exception_value); 397             CHAIN_EXCEPTION(exception_value);
398 398
n 399             exception_lineno = 35; n
400             type_description_1 = "c";
401             goto frame_exception_exit_1;
402         }
403  
404         tmp_assign_source_1 = PyCell_GET(self->m_closure[0]);
405         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)const_str_plain_module_value2, tmp_assign_source_1);
406     }
407     {
408         PyObject *tmp_assign_source_2;
409         if (PyCell_GET(self->m_closure[0]) == NULL) {
410  
411             exception_type = PyExc_NameError;
412             Py_INCREF(exception_type);
413             exception_value = PyUnicode_FromFormat("free variable '%s' referenced before assignment in enclosing scope", "closure_value");
414             exception_tb = NULL;
415             NORMALIZE_EXCEPTION(&exception_type, &exception_value, &exception_tb);
416             CHAIN_EXCEPTION(exception_value);
417  
418             exception_lineno = 38; 399             exception_lineno = 38;
419             type_description_1 = "c"; 400             type_description_1 = "c";
420             goto frame_exception_exit_1; 401             goto frame_exception_exit_1;
421         } 402         }
422 403
t 423         tmp_assign_source_2 = PyCell_GET(self->m_closure[0]); t 404         tmp_assign_source_1 = PyCell_GET(self->m_closure[0]);
424         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)const_str_plain_module_value3, tmp_assign_source_2); 405         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)const_str_plain_module_value3, tmp_assign_source_1);
425     } 406     }
426 407
427 #if 0 408 #if 0
428     RESTORE_FRAME_EXCEPTION(frame_4381a3738a89fa501ec3d01d5ad5d3d0); 409     RESTORE_FRAME_EXCEPTION(frame_4381a3738a89fa501ec3d01d5ad5d3d0);
429 #endif 410 #endif