Hi Steve, On Tue, 27 Nov 2018 at 19:14, Steve Dower <steve.do...@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. _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com