[Python-Dev] Intricacies of calling __eq__

Maciej Fijalkowski fijall at gmail.com
Wed Mar 19 12:08:56 CET 2014


On Tue, Mar 18, 2014 at 11:19 PM, Paul Moore <p.f.moore at gmail.com> wrote:
> On 18 March 2014 19:46, Maciej Fijalkowski <fijall at gmail.com> wrote:
>>> A question: how far away will this optimization apply?
>>>
>>>     if x in d:
>>>         do_this()
>>>         do_that()
>>>         do_something_else()
>>>         spam = d[x]
>>
>> it depends what those functions do. JIT will inline them and if
>> they're small, it should work (although a modification of a different
>> dict is illegal, since aliasing is not proven), but at some point
>> it'll give up (Note that it'll also give up with a call to C releasing
>> GIL since some other thread can modify it).
>
> Surely in the presence of threads the optimisation is invalid anyway
> as other threads can run in between each opcode (I don't know how
> you'd phrase that in a way that wasn't language dependent other than
> "everywhere" :-)) so
>
>     if x in d:
>         # HERE
>         spam = d[x]
>
> d can be modified at HERE. (If d is a local variable, obviously the
> chance that another thread has access to d is a lot lower, but do you
> really do that level of alias tracking?)
>
> Paul

not in the case of JIT that *knows* where the GIL can be released. We
precisely make it not possible every few bytecodes to avoid such
situations.


More information about the Python-Dev mailing list