Skip to content

Potential performance improvements? #1842

Closed
@pfbuxton

Description

@pfbuxton

I have profiled a simple heatmap here:

profile_code.py

from werkzeug.contrib.profiler import ProfilerMiddleware
from app import server

server.config['PROFILE'] = True
server.wsgi_app = ProfilerMiddleware(server.wsgi_app, restrictions=[30])
server.run(debug = True)

app.py

import numpy as np

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objects as go

import flask

# Heatmap
Z = np.random.rand(1000,1000)

server = flask.Flask(__name__)
app = dash.Dash(__name__, server=server)

app.layout = html.Div(children=[
    dcc.Graph(
        id='example-graph',
        figure=dict(
			data=[go.Heatmap(
				z=Z
			)],
			layout=dict()
		)
    )
])

Result (Python 3.7 Windows):

         1068 function calls (1060 primitive calls) in 4.032 seconds

   Ordered by: cumulative time
   List reduced from 243 to 30 due to restriction <30>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    4.032    4.032 C:\Python37-32\lib\site-packages\werkzeug\contrib\profiler.py:95(runapp)
        1    0.000    0.000    4.032    4.032 C:\Python37-32\lib\site-packages\flask\app.py:2262(wsgi_app)
        1    0.000    0.000    4.032    4.032 C:\Python37-32\lib\site-packages\flask\app.py:1801(full_dispatch_request)
        1    0.000    0.000    2.473    2.473 C:\Python37-32\lib\site-packages\flask\app.py:1779(dispatch_request)
        1    0.002    0.002    2.472    2.472 C:\Python37-32\lib\site-packages\dash\dash.py:467(serve_layout)
      2/1    0.013    0.006    2.462    2.462 C:\Python37-32\lib\json\__init__.py:183(dumps)
        1    0.002    0.002    2.451    2.451 C:\Python37-32\lib\site-packages\_plotly_utils\utils.py:35(encode)
        2    0.000    0.000    1.995    0.998 C:\Python37-32\lib\json\encoder.py:182(encode)
        2    1.856    0.928    1.980    0.990 C:\Python37-32\lib\json\encoder.py:204(iterencode)
        1    0.000    0.000    1.559    1.559 C:\Python37-32\lib\site-packages\flask\app.py:1818(finalize_request)
        1    0.000    0.000    1.559    1.559 C:\Python37-32\lib\site-packages\flask\app.py:2091(process_response)
        1    0.000    0.000    1.559    1.559 C:\Python37-32\lib\site-packages\flask_compress.py:78(after_request)
        1    0.000    0.000    1.557    1.557 C:\Python37-32\lib\site-packages\flask_compress.py:113(compress)
        1    0.001    0.001    1.553    1.553 C:\Python37-32\lib\gzip.py:247(write)
        1    1.535    1.535    1.535    1.535 {method 'compress' of 'zlib.Compress' objects}
        1    0.000    0.000    0.452    0.452 C:\Python37-32\lib\json\__init__.py:299(loads)
        1    0.000    0.000    0.452    0.452 C:\Python37-32\lib\json\decoder.py:332(decode)
        1    0.452    0.452    0.452    0.452 C:\Python37-32\lib\json\decoder.py:343(raw_decode)
        4    0.000    0.000    0.124    0.031 C:\Python37-32\lib\site-packages\_plotly_utils\utils.py:66(default)
        1    0.000    0.000    0.093    0.093 C:\Python37-32\lib\site-packages\_plotly_utils\utils.py:123(encode_as_list)
        1    0.093    0.093    0.093    0.093 {method 'tolist' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.017    0.017 C:\Python37-32\lib\site-packages\_plotly_utils\utils.py:131(encode_as_sage)
        3    0.000    0.000    0.017    0.006 C:\Python37-32\lib\site-packages\_plotly_utils\optional_imports.py:15(get_module)
        1    0.000    0.000    0.016    0.016 C:\Python37-32\lib\importlib\__init__.py:109(import_module)
      2/1    0.000    0.000    0.016    0.016 <frozen importlib._bootstrap>:994(_gcd_import)
      2/1    0.000    0.000    0.016    0.016 <frozen importlib._bootstrap>:978(_find_and_load)
      2/1    0.000    0.000    0.016    0.016 <frozen importlib._bootstrap>:948(_find_and_load_unlocked)
        1    0.000    0.000    0.016    0.016 <frozen importlib._bootstrap>:211(_call_with_frames_removed)
        1    0.000    0.000    0.016    0.016 <frozen importlib._bootstrap>:882(_find_spec)
        1    0.000    0.000    0.016    0.016 <frozen importlib._bootstrap_external>:1272(find_spec)

Result with Phython 2.7 linux are almost identical

Looking through the profiling it looks like the main causes is creating the JSON, with
C:\Python37-32\lib\site-packages\_plotly_utils\utils.py taking 2.45s out of a total of 4s.
I know that orjson (only Python 3) can be faster than Python's default JSON. Would you expect that changing to orjson would improve performance / be possible to implement?

Thanks for any insight.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions