-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feature Request] Allow direct import of utils.PlotlyJSONEncoder for faster Dash startup time #2174
Comments
Yeah, doing a direct import would be an easy win. We don't want to import from an underscore method, the official import would be
However, it appears that this import is still slow. I'll transfer this over to plotly.py and we'll see what we can do. This would certainly be much easier than #740. |
@nicolaskruchten @emmanuelle @jonmmease - If we could speed up the import speed of Note - I'm just speculating that |
Thanks for your reply @chriddyp 👍
Can confirm it is imported as a side effect, due to a combination of how the Python import system works (where all |
Maybe an easy, and non-breaking change for I.e. pseudocode for import sys
def __getattr__(name):
# Perform lazy loading of `name` when asked for. See PEP562 and "Rationale" for details.
...
if sys.version_info < (3, 7):
# PEP562 and `__getattr__` implemented in Python 3.7,
# e.g. continue with direct imports as today for users using Python 3.6 (or older).
from plotly import graph_objs, tools, ... |
We can definitely carve out a fast path for Dash just importing the encoder, but these gains are/will all be lost when people use PX or |
Or perhaps Dash forks the encoder and uses its own version. |
Right, but that will only give performance gains when folks use raw dicts and lists for making figures. We need a way to make Dash apps fast even when they use PX :) |
Startup time will be greatly improved by #2368. Thanks to @anders-kiaer for pointing out the potential of PEP 562. Baking this into our code generation class hierarchy really helps. |
🎉 I would consider this issue as solved now after #2368 and lazy imports (if someone uses 🐍 Python < 3.7 and wants the speedup, they should just update their Python minor version... Python 3.7 release was back in 2018, and Python 3.6 has EOL/last security fix next year). Thanks for implementing PEP562 @jonmmease! Looking forward to test it out in Dash 🚀 |
Thanks again @anders-kiaer for bringing this up with us, and steering us in the right direction with lazy loading! |
This issue maybe belongs more to the related
plotly.py
repository, but the motivation comes from using Dash. Please feel free to transfer the issue toplotly.py
if/when more useful.Running
shows real/wall-clock typically above 2 seconds on my system, even when the whole Python distribution is installed locally on the same computer. When using a shared network disk Python distribution, it of course gets slower. 🕙
Running (with Python 3.7 or higher)
shows that a large portion of the time is spent on unused
plotly.graph_objs
imports. The import stems from this line in Dashhttps://github.com/plotly/dash/blob/8ee358826cd4318a3edc52fbf71e0bdda2369984/dash/dash.py#L23
where
dash/dash.py
is usingPlotlyJSONEncoder
fromplotly.utils
.As a quick hack, changing that line to
reduces the
import dash
wall time to 0.6-0.7 seconds, i.e. around 70% reduction in import time fordash
. 🏎 Starting a Dash app suddenly felt much more instant (which is nice during development).The
plotly
Python package I guess is free to change the "private package"_plotly_utils
without releasing a major release, so the "hack" above is not a permanent nice solution fordash
(even thoughdash
does not do any pinning ofplotly
version today, so a new major release ofplotly
might already break previousdash
releases, but that is a separate issue 🙂).I guess the best solution might be to change
plotly/__init__.py
to not import all subpackages, such that the consumer of theplotly
package can choose what to import. It is common to have to import subpackages explicitly, e.g.would not work, while
does. You also typically in the
plotly.py
documentation see lines likewhich is an example of explicit subpackage import, and would work even if
plotly/__init__.py
does not importgraph_objects
into its namespace.Related issue: #740
The text was updated successfully, but these errors were encountered: