creation / pickling of stats distributions
I have some code that uses multiprocessing.Pool for parallelisation. This requires that an object is pickled. This object has an `rv_frozen` distribution as an attribute. It turns out that a performance is much improved if the `rv_frozen` distribution is not present --> pickling of `rv_frozen` objects is expensive. Creation of `rv_frozen` objects is also expensive. ```
import scipy.stats as stats import pickle %timeit stats.norm(scale=1, loc=1) 694 µs ± 123 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) rv = stats.norm(scale=1, loc=1) %timeit s = pickle.dumps(rv); pickle.loads(s) 1.02 ms ± 24 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
I'd be hoping for an order of magnitude less in time for either of those.
Using line profiling two of the big culprits for slowness during object
creation are `rv_continuous._construct_doc` (50% of the total time, with a
large part spent in `_lib.doccer.docformat`!!) and
`rv_continuous._construct_argparser`
My questions are:
1) Is it possible to speed up pickling/unpickling of these objects? (e.g.
__setstate__/__getstate__, custom reduction, copyreg magic, ...)
2) Is there any way to turn off docstring creation (or speeding it up),
besides starting the interpreter with -OO?
_____________________________________
Dr. Andrew Nelson
_____________________________________
While it's not wholly surprising these two are slow, it is surprising they are *that* slow. W.r.t. docstrings, I think there's room for adding a "skip_focstring" kwarg or some such to rv_generic. It'll need to be propagated to `rv_frozen.dist`. I can send a PR or one, if that helps. (I don't know about pickling, sadly.) All that said, maybe it's easier to share the shapes between processes and use regular distributions if rv_frozen is a bottleneck, will that help? ср, 15 июл. 2020 г., 2:03 Andrew Nelson <andyfaff@gmail.com>:
I have some code that uses multiprocessing.Pool for parallelisation. This requires that an object is pickled. This object has an `rv_frozen` distribution as an attribute. It turns out that a performance is much improved if the `rv_frozen` distribution is not present --> pickling of `rv_frozen` objects is expensive. Creation of `rv_frozen` objects is also expensive.
```
import scipy.stats as stats import pickle %timeit stats.norm(scale=1, loc=1) 694 µs ± 123 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) rv = stats.norm(scale=1, loc=1) %timeit s = pickle.dumps(rv); pickle.loads(s) 1.02 ms ± 24 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
I'd be hoping for an order of magnitude less in time for either of those. Using line profiling two of the big culprits for slowness during object creation are `rv_continuous._construct_doc` (50% of the total time, with a large part spent in `_lib.doccer.docformat`!!) and `rv_continuous._construct_argparser` My questions are: 1) Is it possible to speed up pickling/unpickling of these objects? (e.g. __setstate__/__getstate__, custom reduction, copyreg magic, ...) 2) Is there any way to turn off docstring creation (or speeding it up), besides starting the interpreter with -OO? _____________________________________ Dr. Andrew Nelson _____________________________________ _______________________________________________ SciPy-Dev mailing list SciPy-Dev@python.org https://mail.python.org/mailman/listinfo/scipy-dev
Sorry, typo: I can send a PR or *review* one, if that helps. ср, 15 июл. 2020 г., 11:29 Evgeni Burovski <evgeny.burovskiy@gmail.com>:
While it's not wholly surprising these two are slow, it is surprising they are *that* slow.
W.r.t. docstrings, I think there's room for adding a "skip_focstring" kwarg or some such to rv_generic. It'll need to be propagated to `rv_frozen.dist`. I can send a PR or one, if that helps. (I don't know about pickling, sadly.)
All that said, maybe it's easier to share the shapes between processes and use regular distributions if rv_frozen is a bottleneck, will that help?
ср, 15 июл. 2020 г., 2:03 Andrew Nelson <andyfaff@gmail.com>:
I have some code that uses multiprocessing.Pool for parallelisation. This requires that an object is pickled. This object has an `rv_frozen` distribution as an attribute. It turns out that a performance is much improved if the `rv_frozen` distribution is not present --> pickling of `rv_frozen` objects is expensive. Creation of `rv_frozen` objects is also expensive.
```
import scipy.stats as stats import pickle %timeit stats.norm(scale=1, loc=1) 694 µs ± 123 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) rv = stats.norm(scale=1, loc=1) %timeit s = pickle.dumps(rv); pickle.loads(s) 1.02 ms ± 24 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
I'd be hoping for an order of magnitude less in time for either of those. Using line profiling two of the big culprits for slowness during object creation are `rv_continuous._construct_doc` (50% of the total time, with a large part spent in `_lib.doccer.docformat`!!) and `rv_continuous._construct_argparser` My questions are: 1) Is it possible to speed up pickling/unpickling of these objects? (e.g. __setstate__/__getstate__, custom reduction, copyreg magic, ...) 2) Is there any way to turn off docstring creation (or speeding it up), besides starting the interpreter with -OO? _____________________________________ Dr. Andrew Nelson _____________________________________ _______________________________________________ SciPy-Dev mailing list SciPy-Dev@python.org https://mail.python.org/mailman/listinfo/scipy-dev
participants (2)
-
Andrew Nelson -
Evgeni Burovski