Skip to content

Commit 126c40e

Browse files
docs: add iframe to pylab
1 parent 1b78605 commit 126c40e

3 files changed

Lines changed: 371 additions & 89 deletions

File tree

docs/docs/content/get-started/benchmarks.md

Lines changed: 69 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ function initAllCharts() {
5454
xAxis: { type: 'category', data: ['Rayforce-Py', 'Native Rayforce', 'Polars', 'Pandas'], axisLabel: { textStyle: { color: theme.textColor } } },
5555
yAxis: { type: 'value', name: 'Time (μs)', nameLocation: 'middle', nameGap: 50, nameTextStyle: { color: theme.textColor }, axisLabel: { textStyle: { color: theme.textColor } }, splitLine: { lineStyle: { color: theme.gridLineColor } } },
5656
series: [{ name: 'Time (μs)', type: 'bar', data: [
57-
{ value: 623, itemStyle: { color: '#E9A320' } },
58-
{ value: 635, itemStyle: { color: '#1B365D' } },
59-
{ value: 1070, itemStyle: { color: '#718096' } },
60-
{ value: 3649, itemStyle: { color: '#718096' } }
57+
{ value: 611, itemStyle: { color: '#E9A320' } },
58+
{ value: 612, itemStyle: { color: '#1B365D' } },
59+
{ value: 1162, itemStyle: { color: '#d1d5db' } },
60+
{ value: 3556, itemStyle: { color: '#d1d5db' } }
6161
], label: { show: true, position: 'top', textStyle: { color: theme.textColor, fontWeight: 'bold' } } }]
6262
});
6363
chartInstances['q1-chart'] = q1Chart;
@@ -72,10 +72,10 @@ function initAllCharts() {
7272
xAxis: { type: 'category', data: ['Rayforce-Py', 'Native Rayforce', 'Polars', 'Pandas'], axisLabel: { rotate: 0, color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } } },
7373
yAxis: { type: 'value', name: 'Time (μs)', nameLocation: 'middle', nameGap: 50, nameTextStyle: { color: theme.textColor }, axisLabel: { color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } }, splitLine: { lineStyle: { color: theme.gridLineColor } } },
7474
series: [{ name: 'Time (μs)', type: 'bar', data: [
75-
{ value: 1332, itemStyle: { color: '#E9A320' } },
76-
{ value: 1321, itemStyle: { color: '#1B365D' } },
77-
{ value: 6911, itemStyle: { color: '#718096' } },
78-
{ value: 13643, itemStyle: { color: '#718096' } }
75+
{ value: 1279, itemStyle: { color: '#E9A320' } },
76+
{ value: 1290, itemStyle: { color: '#1B365D' } },
77+
{ value: 6753, itemStyle: { color: '#d1d5db' } },
78+
{ value: 13631, itemStyle: { color: '#d1d5db' } }
7979
], label: { show: true, position: 'top', color: theme.textColor } }]
8080
});
8181
chartInstances['q2-chart'] = q2Chart;
@@ -90,10 +90,10 @@ function initAllCharts() {
9090
xAxis: { type: 'category', data: ['Rayforce-Py', 'Native Rayforce', 'Polars', 'Pandas'], axisLabel: { rotate: 0, color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } } },
9191
yAxis: { type: 'value', name: 'Time (μs)', nameLocation: 'middle', nameGap: 50, nameTextStyle: { color: theme.textColor }, axisLabel: { color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } }, splitLine: { lineStyle: { color: theme.gridLineColor } } },
9292
series: [{ name: 'Time (μs)', type: 'bar', data: [
93-
{ value: 834, itemStyle: { color: '#E9A320' } },
94-
{ value: 841, itemStyle: { color: '#1B365D' } },
95-
{ value: 1250, itemStyle: { color: '#718096' } },
96-
{ value: 5104, itemStyle: { color: '#718096' } }
93+
{ value: 829, itemStyle: { color: '#E9A320' } },
94+
{ value: 828, itemStyle: { color: '#1B365D' } },
95+
{ value: 1352, itemStyle: { color: '#d1d5db' } },
96+
{ value: 4846, itemStyle: { color: '#d1d5db' } }
9797
], label: { show: true, position: 'top', color: theme.textColor } }]
9898
});
9999
chartInstances['q3-chart'] = q3Chart;
@@ -108,10 +108,10 @@ function initAllCharts() {
108108
xAxis: { type: 'category', data: ['Rayforce-Py', 'Native Rayforce', 'Polars', 'Pandas'], axisLabel: { rotate: 0, color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } } },
109109
yAxis: { type: 'value', name: 'Time (μs)', nameLocation: 'middle', nameGap: 50, nameTextStyle: { color: theme.textColor }, axisLabel: { color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } }, splitLine: { lineStyle: { color: theme.gridLineColor } } },
110110
series: [{ name: 'Time (μs)', type: 'bar', data: [
111-
{ value: 1032, itemStyle: { color: '#E9A320' } },
112-
{ value: 1039, itemStyle: { color: '#1B365D' } },
113-
{ value: 1443, itemStyle: { color: '#718096' } },
114-
{ value: 6216, itemStyle: { color: '#718096' } }
111+
{ value: 1044, itemStyle: { color: '#E9A320' } },
112+
{ value: 1045, itemStyle: { color: '#1B365D' } },
113+
{ value: 1584, itemStyle: { color: '#d1d5db' } },
114+
{ value: 6216, itemStyle: { color: '#d1d5db' } }
115115
], label: { show: true, position: 'top', color: theme.textColor } }]
116116
});
117117
chartInstances['q4-chart'] = q4Chart;
@@ -126,10 +126,10 @@ function initAllCharts() {
126126
xAxis: { type: 'category', data: ['Rayforce-Py', 'Native Rayforce', 'Polars', 'Pandas'], axisLabel: { rotate: 0, color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } } },
127127
yAxis: { type: 'value', name: 'Time (μs)', nameLocation: 'middle', nameGap: 50, nameTextStyle: { color: theme.textColor }, axisLabel: { color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } }, splitLine: { lineStyle: { color: theme.gridLineColor } } },
128128
series: [{ name: 'Time (μs)', type: 'bar', data: [
129-
{ value: 1035, itemStyle: { color: '#E9A320' } },
130-
{ value: 1042, itemStyle: { color: '#1B365D' } },
131-
{ value: 1363, itemStyle: { color: '#718096' } },
132-
{ value: 6900, itemStyle: { color: '#718096' } }
129+
{ value: 1049, itemStyle: { color: '#E9A320' } },
130+
{ value: 1043, itemStyle: { color: '#1B365D' } },
131+
{ value: 1549, itemStyle: { color: '#d1d5db' } },
132+
{ value: 6879, itemStyle: { color: '#d1d5db' } }
133133
], label: { show: true, position: 'top', color: theme.textColor } }]
134134
});
135135
chartInstances['q5-chart'] = q5Chart;
@@ -144,10 +144,10 @@ function initAllCharts() {
144144
xAxis: { type: 'category', data: ['Rayforce-Py', 'Native Rayforce', 'Polars', 'Pandas'], axisLabel: { rotate: 0, color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } } },
145145
yAxis: { type: 'value', name: 'Time (μs)', nameLocation: 'middle', nameGap: 50, nameTextStyle: { color: theme.textColor }, axisLabel: { color: theme.textColor }, axisLine: { lineStyle: { color: theme.textColor } }, splitLine: { lineStyle: { color: theme.gridLineColor } } },
146146
series: [{ name: 'Time (μs)', type: 'bar', data: [
147-
{ value: 855, itemStyle: { color: '#E9A320' } },
148-
{ value: 853, itemStyle: { color: '#1B365D' } },
149-
{ value: 3237, itemStyle: { color: '#718096' } },
150-
{ value: 4679, itemStyle: { color: '#718096' } }
147+
{ value: 859, itemStyle: { color: '#E9A320' } },
148+
{ value: 846, itemStyle: { color: '#1B365D' } },
149+
{ value: 3316, itemStyle: { color: '#d1d5db' } },
150+
{ value: 4627, itemStyle: { color: '#d1d5db' } }
151151
], label: { show: true, position: 'top', color: theme.textColor } }]
152152
});
153153
chartInstances['q6-chart'] = q6Chart;
@@ -196,10 +196,10 @@ document.addEventListener('DOMContentLoaded', function() {
196196
<div style="flex: 1;">
197197
<div style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;">
198198
<span style="font-weight: 600;">Rayforce-Py</span>
199-
<span style="color: var(--gold-500); font-weight: 700;">952 μs</span>
199+
<span style="color: var(--gold-500); font-weight: 700;">945 μs</span>
200200
</div>
201201
<div style="background: var(--bg-tertiary); height: 8px; border-radius: 4px; overflow: hidden;">
202-
<div style="background: linear-gradient(90deg, #f5c542, #f5c542); height: 100%; width: 14.2%;"></div>
202+
<div style="background: linear-gradient(90deg, #e9a033, #f0b85a); height: 100%; width: 14.3%;"></div>
203203
</div>
204204
</div>
205205
<div style="color: var(--gold-500); font-weight: 700; min-width: 60px; text-align: right;">1.00x</div>
@@ -209,10 +209,10 @@ document.addEventListener('DOMContentLoaded', function() {
209209
<div style="flex: 1;">
210210
<div style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;">
211211
<span style="font-weight: 600;">Native Rayforce</span>
212-
<span style="color: var(--navy-300); font-weight: 700;">955 μs</span>
212+
<span style="color: var(--navy-300); font-weight: 700;">944 μs</span>
213213
</div>
214214
<div style="background: var(--bg-tertiary); height: 8px; border-radius: 4px; overflow: hidden;">
215-
<div style="background: linear-gradient(90deg, #f5c542, #f5c542); height: 100%; width: 14.3%;"></div>
215+
<div style="background: linear-gradient(90deg, #1B365D, #2a4a7a); height: 100%; width: 14.3%;"></div>
216216
</div>
217217
</div>
218218
<div style="color: var(--navy-300); font-weight: 700; min-width: 60px; text-align: right;">1.00x</div>
@@ -222,33 +222,33 @@ document.addEventListener('DOMContentLoaded', function() {
222222
<div style="flex: 1;">
223223
<div style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;">
224224
<span style="font-weight: 600;">Polars</span>
225-
<span style="color: var(--text-secondary); font-weight: 700;">2,546 μs</span>
225+
<span style="color: var(--text-secondary); font-weight: 700;">2,619 μs</span>
226226
</div>
227227
<div style="background: var(--bg-tertiary); height: 8px; border-radius: 4px; overflow: hidden;">
228-
<div style="background: linear-gradient(90deg, var(--text-secondary), var(--text-secondary)); height: 100%; width: 38.0%;"></div>
228+
<div style="background: linear-gradient(90deg, #d1d5db, #e5e7eb); height: 100%; width: 39.5%;"></div>
229229
</div>
230230
</div>
231-
<div style="color: var(--text-secondary); font-weight: 700; min-width: 60px; text-align: right;">2.48x</div>
231+
<div style="color: var(--text-secondary); font-weight: 700; min-width: 60px; text-align: right;">2.61x</div>
232232
</div>
233233

234234
<div style="display: flex; align-items: center; gap: 1rem;">
235235
<div style="flex: 1;">
236236
<div style="display: flex; justify-content: space-between; margin-bottom: 0.5rem;">
237237
<span style="font-weight: 600;">Pandas</span>
238-
<span style="color: var(--text-secondary); font-weight: 700;">6,699 μs</span>
238+
<span style="color: var(--text-secondary); font-weight: 700;">6,626 μs</span>
239239
</div>
240240
<div style="background: var(--bg-tertiary); height: 8px; border-radius: 4px; overflow: hidden;">
241-
<div style="background: linear-gradient(90deg, var(--text-secondary), var(--text-tertiary)); height: 100%; width: 100%;"></div>
241+
<div style="background: linear-gradient(90deg, #d1d5db, #e5e7eb); height: 100%; width: 100%;"></div>
242242
</div>
243243
</div>
244-
<div style="color: var(--text-secondary); font-weight: 700; min-width: 60px; text-align: right;">6.73x</div>
244+
<div style="color: var(--text-secondary); font-weight: 700; min-width: 60px; text-align: right;">6.70x</div>
245245
</div>
246246
</div>
247247

248248

249249
<div class="benchmark-stats" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1.5rem; margin: 2rem 0;">
250250
<div style="background: linear-gradient(135deg, rgba(233, 163, 32, 0.1) 0%, rgba(233, 163, 32, 0.05) 100%); padding: 1.5rem; border-radius: 12px; border: 1px solid rgba(233, 163, 32, 0.2);">
251-
<div style="font-size: 2.5rem; font-weight: 800; color: var(--gold-500); margin-bottom: 0.5rem;">~2.5x</div>
251+
<div style="font-size: 2.5rem; font-weight: 800; color: var(--gold-500); margin-bottom: 0.5rem;">~2.6x</div>
252252
<div style="color: var(--text-secondary); font-size: 0.8rem;">Faster than Polars</div>
253253
</div>
254254
<div style="background: linear-gradient(135deg, rgba(233, 163, 32, 0.1) 0%, rgba(233, 163, 32, 0.05) 100%); padding: 1.5rem; border-radius: 12px; border: 1px solid rgba(233, 163, 32, 0.2);">
@@ -277,10 +277,10 @@ document.addEventListener('DOMContentLoaded', function() {
277277

278278
| Implementation | Time (μs) | vs Native | vs Pandas | vs Polars |
279279
|----------------|-----------|------------|-----------|-----------|
280-
| **Rayforce-Py** | **623** | 1.02x | **5.86x** | **1.72x** |
281-
| Native Rayforce | 635 | 1.00x | 5.75x | 1.68x |
282-
| Polars | 1,070 | 1.68x | 3.41x | 1.00x |
283-
| Pandas | 3,649 | 5.75x | 1.00x | 0.29x |
280+
| **Rayforce-Py** | **611** | 1.00x | **5.82x** | **1.90x** |
281+
| Native Rayforce | 612 | 1.00x | 5.81x | 1.90x |
282+
| Polars | 1,162 | 1.90x | 3.06x | 1.00x |
283+
| Pandas | 3,556 | 5.81x | 1.00x | 0.33x |
284284

285285
---
286286

@@ -290,13 +290,13 @@ document.addEventListener('DOMContentLoaded', function() {
290290

291291
| Implementation | Time (μs) | vs Native | vs Pandas | vs Polars |
292292
|----------------|-----------|------------|-----------|-----------|
293-
| **Rayforce-Py** | **1,332** | 0.99x | **10.24x** | **5.19x** |
294-
| Native Rayforce | 1,321 | 1.00x | 10.33x | 5.23x |
295-
| Polars | 6,911 | 5.23x | 1.97x | 1.00x |
296-
| Pandas | 13,643 | 10.33x | 1.00x | 0.51x |
293+
| **Rayforce-Py** | **1,279** | 0.99x | **10.65x** | **5.28x** |
294+
| Native Rayforce | 1,290 | 1.00x | 10.57x | 5.23x |
295+
| Polars | 6,753 | 5.23x | 2.02x | 1.00x |
296+
| Pandas | 13,631 | 10.57x | 1.00x | 0.50x |
297297

298298
!!! tip "Performance Insight"
299-
Multi-column group by operations show the largest performance advantage, with Rayforce-Py being **10.24x faster** than Pandas and **5.19x faster** than Polars.
299+
Multi-column group by operations show the largest performance advantage, with Rayforce-Py being **10.65x faster** than Pandas and **5.28x faster** than Polars.
300300

301301
---
302302

@@ -306,10 +306,10 @@ document.addEventListener('DOMContentLoaded', function() {
306306

307307
| Implementation | Time (μs) | vs Native | vs Pandas | vs Polars |
308308
|----------------|-----------|------------|-----------|-----------|
309-
| **Rayforce-Py** | **834** | 1.01x | **6.12x** | **1.50x** |
310-
| Native Rayforce | 841 | 1.00x | 6.07x | 1.49x |
311-
| Polars | 1,250 | 1.49x | 4.08x | 1.00x |
312-
| Pandas | 5,104 | 6.07x | 1.00x | 0.24x |
309+
| **Rayforce-Py** | **829** | 1.00x | **5.85x** | **1.63x** |
310+
| Native Rayforce | 828 | 1.00x | 5.85x | 1.63x |
311+
| Polars | 1,352 | 1.63x | 3.58x | 1.00x |
312+
| Pandas | 4,846 | 5.85x | 1.00x | 0.28x |
313313

314314
---
315315

@@ -319,10 +319,10 @@ document.addEventListener('DOMContentLoaded', function() {
319319

320320
| Implementation | Time (μs) | vs Native | vs Pandas | vs Polars |
321321
|----------------|-----------|------------|-----------|-----------|
322-
| **Rayforce-Py** | **1,032** | 1.01x | **6.02x** | **1.40x** |
323-
| Native Rayforce | 1,039 | 1.00x | 5.98x | 1.39x |
324-
| Polars | 1,443 | 1.39x | 4.31x | 1.00x |
325-
| Pandas | 6,216 | 5.98x | 1.00x | 0.23x |
322+
| **Rayforce-Py** | **1,044** | 1.00x | **5.96x** | **1.52x** |
323+
| Native Rayforce | 1,045 | 1.00x | 5.95x | 1.52x |
324+
| Polars | 1,584 | 1.52x | 3.92x | 1.00x |
325+
| Pandas | 6,216 | 5.95x | 1.00x | 0.25x |
326326

327327
---
328328

@@ -332,13 +332,13 @@ document.addEventListener('DOMContentLoaded', function() {
332332

333333
| Implementation | Time (μs) | vs Native | vs Pandas | vs Polars |
334334
|----------------|-----------|------------|-----------|-----------|
335-
| **Rayforce-Py** | **1,035** | 1.01x | **6.67x** | **1.32x** |
336-
| Native Rayforce | 1,042 | 1.00x | 6.62x | 1.31x |
337-
| Polars | 1,363 | 1.31x | 5.06x | 1.00x |
338-
| Pandas | 6,900 | 6.62x | 1.00x | 0.20x |
335+
| **Rayforce-Py** | **1,049** | 1.01x | **6.55x** | **1.48x** |
336+
| Native Rayforce | 1,043 | 1.00x | 6.60x | 1.49x |
337+
| Polars | 1,549 | 1.49x | 4.44x | 1.00x |
338+
| Pandas | 6,879 | 6.60x | 1.00x | 0.23x |
339339

340340
!!! success "Best Performance"
341-
Q5 shows Rayforce-Py performing **6.67x faster** than Pandas and **1.32x faster** than Polars, demonstrating excellent performance on multiple aggregations.
341+
Q5 shows Rayforce-Py performing **6.55x faster** than Pandas and **1.48x faster** than Polars, demonstrating excellent performance on multiple aggregations.
342342

343343
---
344344

@@ -348,25 +348,25 @@ document.addEventListener('DOMContentLoaded', function() {
348348

349349
| Implementation | Time (μs) | vs Native | vs Pandas | vs Polars |
350350
|----------------|-----------|------------|-----------|-----------|
351-
| **Rayforce-Py** | **855** | 1.00x | **5.47x** | **3.79x** |
352-
| Native Rayforce | 853 | 1.00x | 5.49x | 3.79x |
353-
| Polars | 3,237 | 3.79x | 1.45x | 1.00x |
354-
| Pandas | 4,679 | 5.49x | 1.00x | 0.69x |
351+
| **Rayforce-Py** | **859** | 1.02x | **5.39x** | **3.86x** |
352+
| Native Rayforce | 846 | 1.00x | 5.47x | 3.92x |
353+
| Polars | 3,316 | 3.92x | 1.40x | 1.00x |
354+
| Pandas | 4,627 | 5.47x | 1.00x | 0.72x |
355355

356356
---
357357

358358
| Query | Rayforce-Py vs Native | Rayforce-Py vs Pandas | Rayforce-Py vs Polars |
359359
|-------|----------------------|----------------------|----------------------|
360-
| Q1 | 1.02x | **5.86x** | **1.72x** |
361-
| Q2 | 0.99x | **10.24x** | **5.19x** |
362-
| Q3 | 1.01x | **6.12x** | **1.50x** |
363-
| Q4 | 1.01x | **6.02x** | **1.40x** |
364-
| Q5 | 1.01x | **6.67x** | **1.32x** |
365-
| Q6 | 1.00x | **5.47x** | **3.79x** |
366-
| **Average** | **1.00x** | **6.73x** | **2.48x** |
360+
| Q1 | 1.00x | **5.82x** | **1.90x** |
361+
| Q2 | 0.99x | **10.65x** | **5.28x** |
362+
| Q3 | 1.00x | **5.85x** | **1.63x** |
363+
| Q4 | 1.00x | **5.96x** | **1.52x** |
364+
| Q5 | 1.01x | **6.55x** | **1.48x** |
365+
| Q6 | 1.02x | **5.39x** | **3.86x** |
366+
| **Average** | **1.00x** | **6.70x** | **2.61x** |
367367

368368
!!! note "Performance Analysis"
369-
Rayforce-Py adds almost **no overhead** compared to native Rayforce, demonstrating the efficiency of the Python bindings. On average, Rayforce-Py is **6.73x faster** than Pandas and **2.48x faster** than Polars, making it an excellent choice for high-performance data processing.
369+
Rayforce-Py adds almost **no overhead** compared to native Rayforce, demonstrating the efficiency of the Python bindings. On average, Rayforce-Py is **6.70x faster** than Pandas and **2.61x faster** than Polars, making it an excellent choice for high-performance data processing.
370370

371371
Note: The slight performance advantage shown by Rayforce-Py over native Rayforce is due to measurement methodology differences. Native Rayforce benchmarks include memory deallocation overhead, while Rayforce-Py measurements exclude it. In practice, the performance difference is negligible and within measurement noise, demonstrating that the Python bindings introduce virtually no overhead.
372372

0 commit comments

Comments
 (0)