Skip to content

Fix high import time #395

@cvanelteren

Description

@cvanelteren

UltraPlot has a lot of greedy imports (see for example the * imports in __init__.py), we could reduce the import time by making modules available on demand rather than importing everything greedily. For an overview of the import time I used pyinstrument to identify "hot" spots

  pyinstrument import.py

  _     ._   __/__   _ _  _  _ _/_   Recorded: 10:57:43  Samples:  572
 /_//_/// /_\ / //_// / //_'/ //     Duration: 1.217     CPU time: 2.444
/   _/                      v5.1.1

Program: import.py

1.217 <module>  import.py:1
└─ 1.217 <module>  ultraplot/__init__.py:1
   ├─ 0.628 <module>  ultraplot/internals/__init__.py:1
   │  ├─ 0.314 <module>  ultraplot/internals/docstring.py:1
   │  │  ├─ 0.232 <module>  matplotlib/axes/__init__.py:1
   │  │  │     [18 frames hidden]  matplotlib
   │  │  └─ 0.080 <module>  matplotlib/figure.py:1
   │  │        [10 frames hidden]  matplotlib, mpl_toolkits
   │  ├─ 0.116 <module>  matplotlib/__init__.py:1
   │  │     [7 frames hidden]  matplotlib, pyparsing, PIL
   │  ├─ 0.113 <module>  numpy/__init__.py:1
   │  │     [15 frames hidden]  numpy, typing
   │  └─ 0.073 <module>  ultraplot/internals/inputs.py:1
   │     └─ 0.073 <module>  cartopy/__init__.py:1
   │           [7 frames hidden]  cartopy, pyproj, urllib, http
   ├─ 0.307 <module>  ultraplot/config.py:1
   │  ├─ 0.289 <module>  IPython/__init__.py:1
   │  │     [35 frames hidden]  IPython, prompt_toolkit, jedi, stack_...
   │  └─ 0.014 Configurator.__init__  ultraplot/config.py:789
   │     └─ 0.014 Configurator._init  ultraplot/config.py:891
   ├─ 0.076 <module>  mpl_toolkits/basemap/__init__.py:1
   │  ├─ 0.036 [self]  mpl_toolkits/basemap/__init__.py
   │  └─ 0.014 str.strip  <built-in>
   ├─ 0.056 <module>  ultraplot/axes/__init__.py:1
   │  └─ 0.028 <module>  ultraplot/axes/cartesian.py:1
   │     └─ 0.021 <module>  ultraplot/axes/plot.py:1
   │        └─ 0.019 PlotAxes  ultraplot/axes/plot.py:1534
   │           └─ 0.019 _concatenate_inherited  ultraplot/internals/docstring.py:62
   ├─ 0.056 register_colors  ultraplot/config.py:578
   │  └─ 0.052 _standardize_colors  ultraplot/colors.py:710
   │     └─ 0.048 to_xyz  ultraplot/utils.py:681
   │        └─ 0.046 to_xyza  ultraplot/utils.py:708
   │           ├─ 0.028 to_rgba  ultraplot/utils.py:615
   │           └─ 0.018 rgb_to_hcl  ultraplot/externals/hsluv.py:106
   │              └─ 0.016 rgb_to_CIExyz  ultraplot/externals/hsluv.py:263
   ├─ 0.028 <module>  matplotlib/pyplot.py:1
   │     [5 frames hidden]  matplotlib
   └─ 0.018 <module>  ultraplot/ticker.py:1
      └─ 0.014 <module>  cartopy/mpl/ticker.py:1
         └─ 0.014 <module>  cartopy/mpl/geoaxes.py:1

To view this report with different options, run:
    pyinstrument --load-prev 2025-10-30T10-57-43 [options]

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