Construct ClosureVariableAccess

Performance Diagrams

Construct ClosureVariableAccess 00100000010000002000000200000030000003000000400000040000005000000500000060000006000000700000070000008000000800000090000009000000CPython 2.7Nuitka (master)Nuitka (develop)Nuitka (factory)905106689.78846153846155257.0CPython 2.72900150244.59615384615387424.9344701582027Nuitka (master)2900487399.4038461538462424.92526926577574Nuitka (develop)2899479554.2115384615385424.9527900360024Nuitka (factory)Construct ClosureVariableAccessTicks Construct ClosureVariableAccess 001000000100000020000002000000300000030000004000000400000050000005000000600000060000007000000700000080000008000000CPython 3.5Nuitka (master)Nuitka (develop)Nuitka (factory)897331589.78846153846155257.0CPython 3.53450117244.59615384615387409.1028959840286Nuitka (master)3450133399.4038461538462409.102455361343Nuitka (develop)3450354554.2115384615385409.0963692604985Nuitka (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
400             exception_value = PyUnicode_FromFormat( "free variable '%s' referenced before assignment in enclosing scope", "closure_value" ); 400             exception_value = PyUnicode_FromFormat( "free variable '%s' referenced before assignment in enclosing scope", "closure_value" );
401             exception_tb = NULL; 401             exception_tb = NULL;
402             NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb ); 402             NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
403             CHAIN_EXCEPTION( exception_value ); 403             CHAIN_EXCEPTION( exception_value );
404 404
n 405             exception_lineno = 35; n
406             type_description_1 = "c";
407             goto frame_exception_exit_1;
408         }
409  
410         tmp_assign_source_1 = PyCell_GET( self->m_closure[0] );
411         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)const_str_plain_module_value2, tmp_assign_source_1);
412     }
413     {
414         PyObject *tmp_assign_source_2;
415         if ( PyCell_GET( self->m_closure[0] ) == NULL )
416         {
417  
418             exception_type = PyExc_NameError;
419             Py_INCREF(exception_type);
420             exception_value = PyUnicode_FromFormat( "free variable '%s' referenced before assignment in enclosing scope", "closure_value" );
421             exception_tb = NULL;
422             NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
423             CHAIN_EXCEPTION( exception_value );
424  
425             exception_lineno = 38; 405             exception_lineno = 38;
426             type_description_1 = "c"; 406             type_description_1 = "c";
427             goto frame_exception_exit_1; 407             goto frame_exception_exit_1;
428         } 408         }
429 409
t 430         tmp_assign_source_2 = PyCell_GET( self->m_closure[0] ); t 410         tmp_assign_source_1 = PyCell_GET( self->m_closure[0] );
431         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)const_str_plain_module_value3, tmp_assign_source_2); 411         UPDATE_STRING_DICT0(moduledict___main__, (Nuitka_StringObject *)const_str_plain_module_value3, tmp_assign_source_1);
432     } 412     }
433 413
434 #if 0 414 #if 0
435     RESTORE_FRAME_EXCEPTION(frame_74bf81c2dd25d43a5180888aa101f0f4); 415     RESTORE_FRAME_EXCEPTION(frame_74bf81c2dd25d43a5180888aa101f0f4);
436 #endif 416 #endif