@@ -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