On 11/08/2015 04:19 AM, BartC wrote: >> That elegant dynamism comes at a cost: method lookup is not a constant >> memory offset. Rather, it is a dictionary lookup. > > I've never understood why this seems to be necessary in Python. Why do > names have to be looked up? (I'm assuming this is searching by name in > some sort of table.) > > When a module is compiled, while the compiler can't see the definitions > inside the imported modules, it /will/ know all the names that appear in > this module, so it can organise them into fixed tables. Then the names > can be referred to by index. (I think LOAD_FAST does this.) > > Or is eval() the culprit here by making most optimisations impossible?
Perhaps I'm misunderstanding what you're saying, here, but the reason a lookup has to be performed is because python variables are not like C variables. They aren't boxes per se. They are names bound to objects. so doing something like a += 1 Actually assigns the name "a" to an entirely new object than the one it had before, which, from the interpreters point of view, is in an entirely different memory location. Whereas in C, a variable is a box that's always at the same location, so the name is simply not important, and at runtime variables have no names. Python is not like this. names are important at runtime. There may be certain circumstances where the Python compiler could optimize certain types of variable access (say if the variable was bound to integers only) into C-style variables under the hood. But I don't think the benefit would be that great. -- https://mail.python.org/mailman/listinfo/python-list