-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Open
Labels
Description
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()