plotly / plotly/plotly.js

Performance issues with many traces compared to single traces

Aperta
#7,489 1 commento 0 reazioni 1 assegnatario Vedi su GitHub

Nessuno ha ancora preso questa issue.

cs P1
Lingua principale
JavaScript
Stelle
18.3k
Fork
2k
Merge medio
2g 12h
PR unite (30g)
28

Descrizione

Today, Plotly.js starts to stumble when generating charts with many traces, even if the total number of points is the same. This is a Python example but I believe it boils down to plotly.js.

The performance difference is stark (M4 MacBook Air):

python 100k_traces_1_point_each.py 
=== Testing 100k traces with 1 point each ===
Generating data for 100k traces with 1 point each...
Data generation took: 8.78 seconds
Creating plot...
Plot creation took: 2.47 seconds
Total time: 11.25 seconds

=== Testing 1 trace with 100k points ===
Generating data for 1 trace with 100k points...
Data generation took: 0.00 seconds
Creating plot...
Plot creation took: 0.55 seconds
Total time: 0.55 seconds

Reproduce:

import plotly.graph_objects as go
import numpy as np
import time

def test_100k_traces_1_point():
    print("=== Testing 100k traces with 1 point each ===")
    print("Generating data for 100k traces with 1 point each...")
    start_time = time.time()

    traces = []
    for i in range(100000):
        traces.append(go.Scatter(
            x=[np.random.rand()],
            y=[np.random.rand()],
            mode='markers',
            name=f'Trace {i}',
            showlegend=False
        ))

    data_gen_time = time.time() - start_time
    print(f"Data generation took: {data_gen_time:.2f} seconds")

    fig = go.Figure(data=traces)
    fig.update_layout(
        title="100k Traces - 1 Point Each (100k total points)",
        xaxis_title="X Axis",
        yaxis_title="Y Axis"
    )

    print("Creating plot...")
    start_time = time.time()
    fig.show()
    plot_time = time.time() - start_time
    print(f"Plot creation took: {plot_time:.2f} seconds")
    print(f"Total time: {data_gen_time + plot_time:.2f} seconds")

def test_1_trace_100k_points():
    print("\n=== Testing 1 trace with 100k points ===")
    print("Generating data for 1 trace with 100k points...")
    start_time = time.time()

    x_data = np.random.rand(100000)
    y_data = np.random.rand(100000)

    data_gen_time = time.time() - start_time
    print(f"Data generation took: {data_gen_time:.2f} seconds")

    trace = go.Scatter(
        x=x_data,
        y=y_data,
        mode='markers',
        name='Single Trace - 100k Points',
        marker=dict(size=2)
    )

    fig = go.Figure(data=[trace])
    fig.update_layout(
        title="1 Trace - 100k Points",
        xaxis_title="X Axis",
        yaxis_title="Y Axis"
    )

    print("Creating plot...")
    start_time = time.time()
    fig.show()
    plot_time = time.time() - start_time
    print(f"Plot creation took: {plot_time:.2f} seconds")
    print(f"Total time: {data_gen_time + plot_time:.2f} seconds")

if __name__ == "__main__":
    test_100k_traces_1_point()
    test_1_trace_100k_points()

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.