Construct LocalVariableDeletion
Performance Diagrams
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 |