plotly / plotly/plotly.js

Performance issues with many traces compared to single traces

オープン
#7,489 コメント 1 件 リアクション 0 件 担当者 1 名 GitHub で見る

まだ誰も着手していません。

cs P1
主要言語
JavaScript
スター
18.3k
フォーク
2k
平均マージ
2日 12時間
マージ済み PR(30日)
28

説明

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()

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。