plotly / plotly/plotly.js

Performance issues with many traces compared to single traces

Đang mở
#7,489 1 bình luận 0 reaction 1 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

cs P1
Ngôn ngữ chính
JavaScript
Star
18.3k
Fork
2k
Merge trung bình
2 ngày 12 giờ
Pull request đã merge (30 ngày)
28

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.