831831 < h1 > Breaking the Speed Limit</ h1 >
832832 < p class ="subtitle "> Fast statistical models with Python 3.14, Numba, and JAX</ p >
833833 < p class ="tagline "> From a statistician's workflow: validate first, then accelerate the bottleneck.</ p >
834- < p class ="control-plane "> Python stays the control plane; only the validated computational hotspot is accelerated .</ p >
834+ < p class ="control-plane "> Keep the statistical workflow readable in Python; accelerate only the proven bottlenecks .</ p >
835835 < p class ="authors "> Wenxin Jiang · Jian Yin</ p >
836836 < p class ="institute "> Department of Biostatistics, City University of Hong Kong · PyCon US 2026</ p >
837837 </ div >
@@ -846,7 +846,7 @@ <h1>Breaking the Speed Limit</h1>
846846 < section class ="thesis " aria-label ="Main poster rule ">
847847 < p class ="thesis-main ">
848848 < strong > Make the statistical task testable; then accelerate the measured bottleneck.</ strong >
849- < span > Define the target, check agreement, then accelerate only the measured computational hotspot .</ span >
849+ < span > Set the target, validate the output, and specifically speed up the bottleneck .</ span >
850850 </ p >
851851 < div class ="ribbon " aria-label ="Workflow ">
852852 < div class ="ribbon-step "> < b class ="dot "> 1</ b > Simulate</ div >
@@ -855,79 +855,79 @@ <h1>Breaking the Speed Limit</h1>
855855 < div class ="arrow "> ➜</ div >
856856 < div class ="ribbon-step "> < b class ="dot "> 3</ b > Find bottleneck</ div >
857857 < div class ="arrow "> ➜</ div >
858- < div class ="ribbon-step "> < b class ="dot "> 4</ b > Pick the smallest tool</ div >
858+ < div class ="ribbon-step "> < b class ="dot "> 4</ b > Pick the simplest tool</ div >
859859 </ div >
860860 </ section >
861861
862862 < section class ="columns ">
863863 < div class ="col ">
864864 < section >
865- < div class ="section-title blue "> < b class ="dot "> 1</ b > < h2 > Simulation Provides the Test Harness </ h2 > </ div >
866- < p class ="lead "> Real biomedical data rarely provide known truth. Simulation creates a controlled setting for checking recovery, calibration, and agreement.</ p >
865+ < div class ="section-title blue "> < b class ="dot "> 1</ b > < h2 > Simulation Defines "Correct" </ h2 > </ div >
866+ < p class ="lead "> Real biomedical data rarely provides ground truth. Simulation creates a controlled setting to test recovery, calibration, and agreement.</ p >
867867 < div class ="workflow ">
868- < article class ="workflow-card card blue "> < span class ="num "> 01</ span > < strong > Statistical target </ strong > < p > what to estimate, recover, preserve</ p > </ article >
869- < article class ="workflow-card card teal "> < span class ="num "> 02</ span > < strong > Scenario grid </ strong > < p > null, alternative, hard cases</ p > </ article >
870- < article class ="workflow-card card gold "> < span class ="num "> 03</ span > < strong > Reference implementation </ strong > < p > readable Python/NumPy implementation</ p > </ article >
871- < article class ="workflow-card card green "> < span class ="num "> 04</ span > < strong > Validation checks </ strong > < p > recovery, calibration, agreement</ p > </ article >
872- < article class ="workflow-card card gold "> < span class ="num "> 05</ span > < strong > Workload structure </ strong > < p > loops, algebra, repetition, memory</ p > </ article >
873- < article class ="workflow-card card berry "> < span class ="num "> 06</ span > < strong > Selective acceleration </ strong > < p > smallest sufficient tool</ p > </ article >
868+ < article class ="workflow-card card blue "> < span class ="num "> 01</ span > < strong > Define Target </ strong > < p > what to estimate, recover, preserve</ p > </ article >
869+ < article class ="workflow-card card teal "> < span class ="num "> 02</ span > < strong > Build Scenarios </ strong > < p > null, alternative, hard cases</ p > </ article >
870+ < article class ="workflow-card card gold "> < span class ="num "> 03</ span > < strong > Establish Reference </ strong > < p > readable Python/NumPy implementation</ p > </ article >
871+ < article class ="workflow-card card green "> < span class ="num "> 04</ span > < strong > Verify Behavior </ strong > < p > recovery, calibration, agreement</ p > </ article >
872+ < article class ="workflow-card card gold "> < span class ="num "> 05</ span > < strong > Analyze Workload </ strong > < p > loops, algebra, repetition, memory</ p > </ article >
873+ < article class ="workflow-card card berry "> < span class ="num "> 06</ span > < strong > Select Tool </ strong > < p > the minimum sufficient tool</ p > </ article >
874874 </ div >
875- < div class ="gate "> Gate: optimization starts only after validation passes.</ div >
875+ < div class ="gate "> Rule: Do not optimize until validation passes.</ div >
876876 </ section >
877877
878878 < section >
879879 < div class ="section-title gold "> < b class ="dot "> 2</ b > < h2 > Decisions Before Timing</ h2 > </ div >
880880 < table class ="decision-table card ">
881881 < thead > < tr > < th > Question</ th > < th > Decision before measuring speed</ th > </ tr > </ thead >
882882 < tbody >
883- < tr > < td > Scientific target</ td > < td > estimator, statistic, null, stopping rule</ td > </ tr >
884- < tr > < td > Ground truth</ td > < td > labels, known effect, nominal type-I rate </ td > </ tr >
885- < tr > < td > Acceptance</ td > < td > exact match, tolerance, recovery, calibration</ td > </ tr >
886- < tr > < td > Failure meaning </ td > < td > implementation , method, or systems limit </ td > </ tr >
887- < tr > < td > Scale stress </ td > < td > dimensions that make work expensive </ td > </ tr >
883+ < tr > < td > Statistical target</ td > < td > estimator, test statistic, or stopping rule</ td > </ tr >
884+ < tr > < td > Simulated truth</ td > < td > labels, effect size, or nominal alpha </ td > </ tr >
885+ < tr > < td > Acceptance criteria </ td > < td > exact match, numerical tolerance, or calibration</ td > </ tr >
886+ < tr > < td > Failure mode </ td > < td > code bug , method breakdown , or out-of-memory (OOM) </ td > </ tr >
887+ < tr > < td > Cost drivers </ td > < td > samples (n), features (p), or repeats (R) </ td > </ tr >
888888 </ tbody >
889889 </ table >
890890 </ section >
891891
892892 < section >
893- < div class ="section-title green "> < b class ="dot "> 3</ b > < h2 > Validation Gates Passed</ h2 > </ div >
893+ < div class ="section-title green "> < b class ="dot "> 3</ b > < h2 > Validation Checks Passed</ h2 > </ div >
894894 < article class ="validation-gate card ">
895- < h3 > All speed claims below passed these checks. </ h3 >
895+ < h3 > Speedup results verified using these criteria: </ h3 >
896896 < div class ="gate-list ">
897- < div class ="gate-row "> < b > ✓</ b > < span > < strong > k -means:</ strong > max relative inertia difference 3.1e-14 < tolerance 1e-8.</ span > </ div >
898- < div class ="gate-row "> < b > ✓</ b > < span > < strong > permutation :</ strong > same test statistic, same p-value definition, same resampling stream; max |p diff| = 0.0.</ span > </ div >
899- < div class ="gate-row "> < b > ✓</ b > < span > < strong > statistic difference:</ strong > max |stat diff| = 9.4e-16 across the recorded validation grid.</ span > </ div >
900- < div class ="gate-row "> < b > ✓</ b > < span > < strong > null calibration:</ strong > estimated type-I error 0.051 near nominal alpha 0.05.</ span > </ div >
897+ < div class ="gate-row "> < b > ✓</ b > < span > < strong > K -means agreement :</ strong > max relative inertia difference is 3.1e-14 (well below the 1e-8 tolerance) .</ span > </ div >
898+ < div class ="gate-row "> < b > ✓</ b > < span > < strong > Permutation equivalence :</ strong > same test statistic, same p-value definition, same resampling stream; max |p diff| = 0.0.</ span > </ div >
899+ < div class ="gate-row "> < b > ✓</ b > < span > < strong > Statistic difference:</ strong > max |stat diff| = 9.4e-16 across the validation grid.</ span > </ div >
900+ < div class ="gate-row "> < b > ✓</ b > < span > < strong > Null calibration:</ strong > estimated type-I error 0.051 aligns with nominal alpha 0.05.</ span > </ div >
901901 </ div >
902902 </ article >
903903 </ section >
904904
905905 < section >
906- < div class ="section-title purple "> < b class ="dot "> AI</ b > < h2 > AI Scales the Workflow; the Statistician Owns the Claim </ h2 > </ div >
906+ < div class ="section-title purple "> < b class ="dot "> AI</ b > < h2 > AI for Scale, Statistician for Science </ h2 > </ div >
907907 < div class ="ai-grid ">
908908 < article class ="ai-card card teal ">
909909 < div >
910- < strong > What AI can automate </ strong >
910+ < strong > AI Automates Execution </ strong >
911911 < ul >
912- < li > implementation variants</ li >
913- < li > scenario-grid runners </ li >
914- < li > metadata capture </ li >
915- < li > plot regeneration</ li >
916- < li > result manifests</ li >
912+ < li > Code variants</ li >
913+ < li > Scenario grids </ li >
914+ < li > Metadata tracking </ li >
915+ < li > Plot regeneration</ li >
916+ < li > Result manifests</ li >
917917 </ ul >
918918 </ div >
919919 < img class ="duty-art " src ="assets/ai_duty_thumb.png " alt ="Automation layer illustration " />
920920 < p class ="role-caption "> AI assistant automating experiment tasks</ p >
921921 </ article >
922922 < article class ="ai-card card green ">
923923 < div >
924- < strong > What the statistician decides </ strong >
924+ < strong > Statistician Owns Inference </ strong >
925925 < ul >
926- < li > statistical target</ li >
927- < li > data-generating assumptions</ li >
928- < li > validation criteria</ li >
929- < li > interpretation of difficult cases </ li >
930- < li > scientific claims</ li >
926+ < li > Statistical target</ li >
927+ < li > Data assumptions</ li >
928+ < li > Validation criteria</ li >
929+ < li > Hard-case interpretation </ li >
930+ < li > Scientific claims</ li >
931931 </ ul >
932932 </ div >
933933 < img class ="duty-art " src ="assets/human_duty_thumb.png " alt ="Statistician judgment illustration " />
@@ -942,46 +942,50 @@ <h3>All speed claims below passed these checks.</h3>
942942 < div class ="section-title teal "> < b class ="dot "> 4</ b > < h2 > Two Workloads, Two Bottleneck Patterns</ h2 > </ div >
943943 < div class ="workload-grid ">
944944 < article class ="workload blue ">
945- < h3 > k -means = iterative fitting </ h3 >
945+ < h3 > K -means = Iterative Fitting </ h3 >
946946 < div class ="figure card ">
947947 < img src ="figures/kmeans_illustration.png " alt ="k-means iterative fitting illustration " />
948948 < div class ="chips "> < span class ="chip "> distance loops</ span > < span class ="chip "> temporaries</ span > < span class ="chip "> compiled kernels</ span > </ div >
949949 </ div >
950950 </ article >
951951 < article class ="workload green ">
952- < h3 > permutation = resampling inference </ h3 >
952+ < h3 > Permutation = Resampling Inference </ h3 >
953953 < div class ="figure card ">
954954 < img src ="figures/permutation_task_schematic.png " alt ="permutation-test workflow schematic " />
955955 < div class ="chips "> < span class ="chip "> shared arrays</ span > < span class ="chip "> batching</ span > < span class ="chip "> W @ X</ span > </ div >
956956 </ div >
957957 </ article >
958958 </ div >
959- < div class ="contract " style ="font-size: 1cqb; "> < strong > Validation contract:</ strong > k-means keeps the same data, initialization, and stopping rule; permutation keeps the same resampling stream and p-value definition.</ div >
959+ < div class ="contract " style ="font-size: 1cqb; ">
960+ < strong > Validation criteria:</ strong >
961+ < b > K-means</ b > keeps same data, initialization, and stopping rule.
962+ < b > Permutation</ b > keeps same resampling stream and p-value definition.
963+ </ div >
960964 </ section >
961965
962966 < article class ="takeaway-strip card ">
963- < strong > Validate the analysis before optimizing the implementation .</ strong >
964- < span > Speed only counts after agreement with the reference passes the validation criteria .</ span >
967+ < strong > Validate the Statistic, Then Accelerate .</ strong >
968+ < span > Speed only counts when the statistical target is preserved .</ span >
965969 </ article >
966970
967971 < section >
968- < div class ="section-title berry "> < b class ="dot "> 5</ b > < h2 > After Validation, Performance Depends on Workload Structure</ h2 > </ div >
972+ < div class ="section-title berry "> < b class ="dot "> 5</ b > < h2 > Performance Depends on Workload Structure</ h2 > </ div >
969973 < div class ="evidence-grid ">
970974 < article class ="plot-card card ">
971- < h3 > K-means: workload structure determines the implementation </ h3 >
975+ < h3 > K-means: Workload Shape Determines the Tool </ h3 >
972976 < ul class ="shape-notes ">
973- < li > loop -dominated computations: Numba, NumPy, and A100 are similar </ li >
974- < li > dense distance computations: NumPy / BLAS is best </ li >
975- < li > large regular batches: JAX / A100 is best </ li >
977+ < li > < strong > Loop -dominated: </ strong > Numba, NumPy, and GPU tie. </ li >
978+ < li > < strong > Dense algebra: </ strong > NumPy / BLAS dominates. </ li >
979+ < li > < strong > Large regular batches:</ strong > JAX / GPU wins. </ li >
976980 </ ul >
977981 < img src ="figures/kmeans_evidence_rows_cropped.png " alt ="Server k-means evidence showing implementation choice depends on workload structure " />
978982 </ article >
979983 < article class ="plot-card card ">
980- < h3 > Permutation: A100 is useful only after batching and streaming </ h3 >
984+ < h3 > Permutation: GPU Demands Batching and Streaming </ h3 >
981985 < ul class ="shape-notes ">
982- < li > A100 becomes advantageous after batching and streamed reduction</ li >
983- < li > largest validated speedup in this grid: 8.54×</ li >
984- < li > out-of-memory configurations are reported explicitly </ li >
986+ < li > < strong > GPU prerequisite: </ strong > batching and streamed reduction</ li >
987+ < li > < strong > Validated speedup: </ strong > peaks at 8.54×</ li >
988+ < li > < strong > Memory limits: </ strong > OOM configurations remain explicit </ li >
985989 </ ul >
986990 < img src ="figures/gpu_permutation_decision_map.png " alt ="GPU permutation decision map " />
987991 </ article >
@@ -993,39 +997,39 @@ <h3>Permutation: A100 is useful only after batching and streaming</h3>
993997 < section >
994998 < div class ="section-title berry "> < b class ="dot "> 6</ b > < h2 > Bottleneck Signal → Smallest Move</ h2 > </ div >
995999 < article class ="diagnostic-guide card ">
996- < h3 > Reusable diagnostic guide </ h3 >
997- < div class ="diagnostic-row "> < strong > validation fails </ strong > < span > revisit the statistical definition or implementation </ span > </ div >
998- < div class ="diagnostic-row "> < strong > loop-dominated Python code </ strong > < span > Numba</ span > </ div >
999- < div class ="diagnostic-row "> < strong > dense array algebra </ strong > < span > NumPy / BLAS</ span > </ div >
1000- < div class ="diagnostic-row "> < strong > repeated independent work </ strong > < span > threads / workers </ span > </ div >
1001- < div class ="diagnostic-row "> < strong > large regular batches </ strong > < span > JAX / A100 </ span > </ div >
1002- < div class ="diagnostic-row "> < strong > memory-limited workload </ strong > < span > streaming / reduction </ span > </ div >
1000+ < h3 > Diagnostic Guide: Signal vs. Action </ h3 >
1001+ < div class ="diagnostic-row "> < strong > Validation Failure </ strong > < span > Revisit the Statistic or Implementation </ span > </ div >
1002+ < div class ="diagnostic-row "> < strong > Loop-Dominated Python</ strong > < span > Numba</ span > </ div >
1003+ < div class ="diagnostic-row "> < strong > Dense Array Algebra </ strong > < span > NumPy / BLAS</ span > </ div >
1004+ < div class ="diagnostic-row "> < strong > Repeated Independent Work </ strong > < span > Threads / Workers </ span > </ div >
1005+ < div class ="diagnostic-row "> < strong > Large Regular Batches </ strong > < span > JAX / GPU </ span > </ div >
1006+ < div class ="diagnostic-row "> < strong > Memory-Bound Workload </ strong > < span > Streamed Reduction </ span > </ div >
10031007 </ article >
10041008 </ section >
10051009
10061010 < section >
10071011 < div class ="section-title berry "> < b class ="dot "> 7</ b > < h2 > Tool Choices in This Talk</ h2 > </ div >
1008- < p class ="lead "> Examples, not a ranking.</ p >
1012+ < p class ="lead "> Mapping validated bottlenecks to tools. Not a hardware ranking.</ p >
10091013 < div class ="tool-grid ">
10101014 < article class ="tool card green ">
10111015 < strong > Numba</ strong >
1012- < b > loop-dominated CPU code </ b >
1013- < em > k -means assignment/update </ em >
1016+ < b > Explicit CPU Loops </ b >
1017+ < em > K -means Assignment / Update </ em >
10141018 </ article >
10151019 < article class ="tool card blue ">
10161020 < strong > NumPy / BLAS</ strong >
1017- < b > dense distance algebra </ b >
1018- < em > distance identity and W @ X on CPU</ em >
1021+ < b > Dense Matrix Algebra </ b >
1022+ < em > Distance Identity and W @ X ( CPU) </ em >
10191023 </ article >
10201024 < article class ="tool card teal ">
10211025 < strong > Threads / workers</ strong >
1022- < b > repeated work over shared data </ b >
1023- < em > permutation worker sweep </ em >
1026+ < b > Shared-Data Repetition </ b >
1027+ < em > Permutation Worker Sweep </ em >
10241028 </ article >
10251029 < article class ="tool card berry ">
1026- < strong > JAX / A100 </ strong >
1027- < b > device-resident regular batches </ b >
1028- < em > streamed W @ X after validation </ em >
1030+ < strong > JAX / GPU </ strong >
1031+ < b > Large Regular Batches </ b >
1032+ < em > Streamed W @ X (After Validation) </ em >
10291033 </ article >
10301034 </ div >
10311035 </ section >
@@ -1034,12 +1038,12 @@ <h3>Reusable diagnostic guide</h3>
10341038 < div class ="section-title orange "> < b class ="dot "> 8</ b > < h2 > Report Every Speed Claim</ h2 > </ div >
10351039 < article class ="report-card card ">
10361040 < div class ="checks ">
1037- < div > < b > ✓</ b > < span > validation target and acceptance criteria </ span > </ div >
1038- < div > < b > ✓</ b > < span > compute tier: local validation, server CPU, or A100 </ span > </ div >
1039- < div > < b > ✓</ b > < span > cold/warm timing and compilation treatment </ span > </ div >
1040- < div > < b > ✓</ b > < span > transfer, allocation, and collection treatment </ span > </ div >
1041- < div > < b > ✓</ b > < span > unavailable or out-of-memory configurations reported explicitly </ span > </ div >
1042- < div > < b > ✓</ b > < span > smallest tool that preserves the statistical result </ span > </ div >
1041+ < div > < b > ✓</ b > < span > < strong > Validation Criteria: </ strong > target and acceptance threshold </ span > </ div >
1042+ < div > < b > ✓</ b > < span > < strong > Compute Tier: </ strong > local validation, server CPU, or GPU </ span > </ div >
1043+ < div > < b > ✓</ b > < span > < strong > Timing State: </ strong > cold/warm execution and compilation handling </ span > </ div >
1044+ < div > < b > ✓</ b > < span > < strong > Memory Overhead: </ strong > transfer, allocation, and collection costs </ span > </ div >
1045+ < div > < b > ✓</ b > < span > < strong > Failure Modes: </ strong > OOM and unavailable configurations remain explicit </ span > </ div >
1046+ < div > < b > ✓</ b > < span > < strong > Tool Selection: </ strong > simplest tool preserving the statistic </ span > </ div >
10431047 </ div >
10441048 < div class ="gate "> Timing semantics: compilation excluded; data transfer included; kernel-only timings not reported.</ div >
10451049 </ article >
0 commit comments