Description
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 to plotly.py
if/when more useful.
Running
time python -c "import dash"
real 0m2.172s
user 0m1.183s
sys 0m0.566s
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)
python -X importtime -c "import dash"
shows that a large portion of the time is spent on unused plotly.graph_objs
imports. The import stems from this line in Dash
https://github.com/plotly/dash/blob/8ee358826cd4318a3edc52fbf71e0bdda2369984/dash/dash.py#L23
where dash/dash.py
is using PlotlyJSONEncoder
from plotly.utils
.
As a quick hack, changing that line to
from _plotly_utils.utils import PlotlyJSONEncoder
reduces the import dash
wall time to 0.6-0.7 seconds, i.e. around 70% reduction in import time for dash
. 🏎 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 for dash
(even though dash
does not do any pinning of plotly
version today, so a new major release of plotly
might already break previous dash
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 the plotly
package can choose what to import. It is common to have to import subpackages explicitly, e.g.
python -c "import matplotlib; print(matplotlib.pyplot.__file__)"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AttributeError: module 'matplotlib' has no attribute 'pyplot'
would not work, while
python -c "import matplotlib.pyplot; print(matplotlib.pyplot.__file__)"
[...]/python3.7/site-packages/matplotlib/pyplot.py
does. You also typically in the plotly.py
documentation see lines like
import plotly.graph_objects as go
which is an example of explicit subpackage import, and would work even if plotly/__init__.py
does not import graph_objects
into its namespace.
Related issue: #740