Hi all,

I am a long time user of astropy.units, which allows one to define
quantities with physical units as follows:

>>> from astropy import units as u
>>> 10 << u.cm
<Quantity 10. cm>
>>> np.sqrt(4 << u.m ** 2)
<Quantity 2. m>
>>> ([1, 1, 0] << u.m) @ ([0, 10, 20] << u.cm / u.s)
<Quantity 10. cm m / s>
>>> (([1, 1, 0] << u.m) * ([0, 10, 20] << u.cm / u.s)).to(u.m ** 2 /
u.s)
<Quantity [0. , 0.1, 0. ] m2 / s>

The mechanism works by subclassing numpy.ndarray and leveraging
__array_function__ support aka NEP 18. Internally it is something like
this:

>>> v = np.array(10, dtype=np.float64, copy=False, order=None,
subok=True, ndmin=0)
>>> vu = v.view(u.Quantity)
>>> vu._set_unit(u.cm)
>>> vu
<Quantity 10. cm>

However, over the years I have been constantly annoyed by the fact that
it is tremendously slow. I'm not critizing Astropy devs, the problem
seems objectively difficult: although some code paths could be optimized
at the cost of losing some syntactic sugar or breaking backwards
compatibility, `isinstance` calls and introspection in general are slow.

Setting aside the question of trying to make astropy.units faster (which
may or may not be possible), I was thinking how feasible could it be to
implement something similar, but using a compiled language instead (C,
Cython, Rust, whatever) and leveraging "modern" dispatch mechanisms. But
after reading about NEP 18, NEP 47, uarray, and various pull requests
and issues here and there
(https://labs.quansight.org/blog/2021/11/pydata-extensibility-vision/
and https://github.com/scipy/scipy/issues/10204#issuecomment-787067947
among others) I don't fully grasp the differences between the
approaches, and I don't know if what I am proposing is feasible at all.
Since IIUC the numpy function or ufunc is passed to __array_function__
and __array_ufunc__ respectively, I am not sure how would that interact
with the code being in a foreign language (I assume the NumPy C API
would have to be used).

If folks have advice, ideas, or suggestions for a direction, I'll be
happy to read them.

Best!
_______________________________________________
NumPy-Discussion mailing list -- numpy-discussion@python.org
To unsubscribe send an email to numpy-discussion-le...@python.org
https://mail.python.org/mailman3/lists/numpy-discussion.python.org/
Member address: arch...@mail-archive.com

Reply via email to