[Python-Dev] C API changes

Hi Steve,
On Tue, 27 Nov 2018 at 19:14, Steve Dower <steve.dower at python.org> wrote:
> On 27Nov2018 0609, Victor Stinner wrote:
> > Note: Again, in my plan, the new C API would be an opt-in API. The old
> > C API would remain unchanged and fully supported. So there is no
> > impact on performance if you consider to use the old C API.
>
> This is one of the things that makes me think your plan is not feasible.
I can easily imagine the new API having two different implementations
even for CPython:
A) you can use the generic implementation, which produces a
cross-python-compatible .so. All function calls go through the API at
runtime. The same .so works on any version of CPython or PyPy.
B) you can use a different set of headers or a #define or something,
and you get a higher-performance version of your unmodified
code---with the issue that the .so only runs on the exact version of
CPython. This is done by defining some of the functions as macros. I
would expect this version to be of similar speed than the current C
API in most cases.
This might give a way forward: people would initially port their
extensions hoping to use the option B; once that is done, they can
easily measure---not guess--- the extra performance costs of the
option A, and decide based on actual data if the difference is really
worth the additional troubles of distributing many versions. Even if
it is, they can distribute an A version for PyPy and for unsupported
CPython versions, and add a few B versions on top of that.
...Also, although I'm discussing it here, I think the whole approach
would be better if done as a third-party extension for now, without
requiring changes to CPython---just use the existing C API to
implement the CPython version. The B option discussed above can even
be mostly *just* a set of macros, with a bit of runtime that we might
as well include in the produced .so in order to make it a standalone,
regular CPython C extension module.
A bient?t,
Armin.
PS: on CPython could use ``typedef struct { PyObject *_obj; }
PyHandle;``. This works like a pointer, but you can't use ``==`` to
compare them.