Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.3k
Description
LOAD_FAST accounts for14.6% of all bytecodes executed. Including superinstructions brings this up to 14.6+4.7+4.6+2.4+0.9 = 27.1%
Lines 1864 to 1872 in202ed25
| TARGET(LOAD_FAST) { | |
| PyObject*value=GETLOCAL(oparg); | |
| if (value==NULL) { | |
| gotounbound_local_error; | |
| } | |
| Py_INCREF(value); | |
| PUSH(value); | |
| DISPATCH(); | |
| } |
We can turn this NULL-check into an assertion in many cases, where we can determine at compile time that the local variable is already initialized. Preliminary tests show that almost allLOAD_FAST instructions can be statically analyzed to be loading already-initialized variables.
The one twist is handlingdel frame.f_locals["x"] orframe.f_lineno = 17, where previously-safe loads could become unsafe. For now, we can just replace all theLOAD_FAST (no null check) withLOAD_FAST_CHECK in that particular code object.
See alsofaster-cpython/ideas#306