Skip to content

[Feature Request] Allow direct import of utils.PlotlyJSONEncoder for faster Dash startup time #2174

Closed
@anders-kiaer

Description

@anders-kiaer

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions