GIL - это обычный мьютекс. Стоимость блокировки или разблокирования мьютекса неоспоримый чрезвычайно низка, не намного больше, чем стоимость изменения глобальной переменной. Однако, если вы блокируете и разблокируете оспариваемый мьютекс очень часто, стоимость мьютекса может стать значительной.
Итак, обычно это не очень хорошая идея:
Py_BEGIN_ALLOW_THREADS
a = 1 + 1;
Py_END_ALLOW_THREADS
То, что здесь происходит, - вы открываете мьютекс, который сразу после этого пытаетесь снова заблокировать. Если это разрыв между двумя большими частями кода, то это дает возможность другому потоку работать. Но если у вас нет проблем с гранулярностью потоков, просто сохраните блокировку.
Так что это хорошая идея в этом контексте:
very_long_computation_requires_gil();
Py_BEGIN_ALLOW_THREADS;
a = a + i;
Py_END_ALLOW_THREADS;
very_long_computation_also_requires_gil();
На самом деле невозможно сделать обоснованное предположение, не зная контекста, и зачастую все еще сложно без проведения тестов.