Message304554
I question those timings. Here's the results from a script I've been using for many years:
$ python3.6 variable_access.py
0.065 read_local
0.068 read_nonlocal
0.179 read_global
0.236 read_builtin
0.267 read_classvar
0.392 read_instancevar
0.291 read_unboundmethod
0.383 read_boundmethod
0.077 write_local
0.069 write_nonlocal
0.240 write_global
1.154 write_classvar
0.540 write_instance
See the attached timing script: variable_access.py
Also, take a look at the underlying code:
#define GETLOCAL(i) (fastlocals[i])
TARGET(LOAD_FAST) {
PyObject *value = GETLOCAL(oparg);
if (value == NULL) {
...
}
Py_INCREF(value);
PUSH(value);
FAST_DISPATCH();
}
#define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref)
TARGET(LOAD_DEREF) {
PyObject *cell = freevars[oparg];
PyObject *value = PyCell_GET(cell);
if (value == NULL) {
...
}
Py_INCREF(value);
PUSH(value);
DISPATCH();
}
You can see that the only difference is that LOAD_DEREF has one extra indirection. That should be very cheap. In contrast, a LOAD_GLOBAL does a lot more work. If this isn't evident in your timings, I suspect there is something wrong with the timings. |
|
Date |
User |
Action |
Args |
2017-10-18 04:09:08 | rhettinger | set | recipients:
+ rhettinger, terry.reedy, serhiy.storchaka, Aaron Hall |
2017-10-18 04:09:08 | rhettinger | set | messageid: <1508299748.57.0.213398074469.issue31753@psf.upfronthosting.co.za> |
2017-10-18 04:09:08 | rhettinger | link | issue31753 messages |
2017-10-18 04:09:08 | rhettinger | create | |
|