持仓风险度:Rust 与同算法 Python
先验证语义,再测量性能。不预设加速结论,不把算法差异计入语言加速。
结论边界
以下是本机、固定 mock、预热后重复测量的结果。 Python 对照按 Rust 的「稳定排序 + 聚合树」重新实现,不使用飞书原 Python 源码。 这不是对所有 pandas/NumPy 实现或所有硬件的速度承诺;小输入可能由转换开销主导。 速比 = Python 中位数 / Rust 中位数,小于 1 表示 Rust 更慢。
主结果(中位数,毫秒)
| 场景 | N 行 | T 时间 | S 品种 | Python E2E | Rust E2E | Python 核心 | Rust 核心 | 转换合计 | E2E 速比 | 核心速比 |
|---|---|---|---|---|---|---|---|---|---|---|
| tiny | 12 | 4 | 3 | 0.950 | 1.027 | 0.507 | 0.008 | 0.444 | 0.93× | 65.45× |
| small-dense | 1,000 | 100 | 10 | 2.962 | 1.916 | 1.764 | 0.061 | 0.781 | 1.55× | 29.10× |
| dense-100k | 100,000 | 1,000 | 100 | 209.156 | 17.040 | 199.336 | 6.508 | 2.539 | 12.27× | 30.63× |
| dense-500k | 500,000 | 2,000 | 250 | 1199.793 | 68.580 | 1176.004 | 34.103 | 8.851 | 17.49× | 34.48× |
| sparse-1000-symbols | 60,000 | 20,000 | 1,000 | 217.422 | 15.149 | 210.021 | 5.484 | 2.215 | 14.35× | 38.30× |
| shuffled-duplicates | 44,000 | 2,000 | 100 | 125.517 | 11.487 | 118.490 | 3.798 | 1.843 | 10.93× | 31.20× |
计时范围与公平性
- 两端共享相同原始输入、输入规范化、七个 float64 指标和 datetime 输出契约。逐场景断言所有列数值一致(rtol/atol 1e-12、NaN 同位)。
- E2E 是实际公共调用独立计时,包含输入规范化、计算、输出 DataFrame;Rust 还包含四段 Arrow IPC 转换与 PyO3 调用。
- 核心 = 已规范化的本语言 DataFrame → 输出 DataFrame:包含字段提取、品种编码、校验(Rust)、稳定排序、树更新、结果物化;不是仅树循环。
- Rust 内部 Instant 分别测 IPC 解码、完整核心、IPC 编码;普通公共调用不插入计时器。Python 核心独立计时。
- 转换合计 = Python IPC 编码 + Rust IPC 解码 + Rust IPC 编码 + Python IPC 解码的每轮分段和;不把 E2E−核心的噪声残差当作转换。
- 分段来自独立调用,不应精确相加为 E2E。PyO3 调用/返回字节拷贝、计时器等未归入四段转换;native_profile_call 给出整个仪表化边界调用供检查。
- 固定 seed、同一进程、预热、每轮随机交错顺序、保留全部样本及 min/median/p95。数据生成、正确性断言、导入、编译和 HTML 生成不计时。
- 这是墙钟耗时,未绑定 CPU、未控制系统负载/温度;少量重复的 P95 只是描述统计,不是置信区间。未测峰值内存或并发吞吐。
实现与正确性
时间必须先升序;品种未出现前为空仓,NaN 沿用历史,跨日不断仓,零表示平仓。 同时间同品种最后非缺失值胜出。允许杠杆;空头为零时多空比为 NaN。空输入保留八列,拒绝缺失键和无限权重,保留纳秒与时区。
连续 Vec 聚合树维护总/多/空/净/最大/平方和,更新复杂度 O(log S),总复杂度 O(N log N + N log S + T),空间 O(N+S+T),不创建 T×S 网格。 重算父节点避免历史增减累积误差;float64 仍存在舍入与溢出限制。没有 unsafe、fast-math 或并行归约。
测试使用手算预期和独立稠密历史 oracle(每时刻每品种重选历史最后有效记录并用 math.fsum),不只验证两棵树互相一致。 覆盖乱序、隔夜、重复、缺失、全空仓、杠杆、纳秒/时区、空输入、错误输入、大仓平仓恢复小仓;具体运行证据见随 PR 提交的 verification.txt。
实现前参考 Rust Book iterator performance、Cargo profiles、PyO3 0.28 performance/parallelism 官方文档;来源及设计取舍见 docs/position_risk.md。
分场景分层数据
tiny — 分层统计 / ms
| 阶段 | Min | Median | P95 |
|---|---|---|---|
| rust_e2e | 0.8232 | 1.0265 | 1.3023 |
| python_e2e | 0.7763 | 0.9500 | 1.7912 |
| python_core | 0.3827 | 0.5072 | 0.5402 |
| normalize | 0.4309 | 0.5153 | 1.2151 |
| python_ipc_encode | 0.1385 | 0.1607 | 0.2460 |
| python_ipc_decode | 0.1926 | 0.2273 | 1.2880 |
| native_profile_call | 0.0340 | 0.0463 | 0.0738 |
| rust_ipc_decode | 0.0097 | 0.0153 | 0.0265 |
| rust_core | 0.0054 | 0.0077 | 0.0131 |
| rust_ipc_encode | 0.0143 | 0.0185 | 0.0276 |
| conversion_total | 0.3664 | 0.4437 | 1.5008 |
small-dense — 分层统计 / ms
| 阶段 | Min | Median | P95 |
|---|---|---|---|
| rust_e2e | 1.5763 | 1.9156 | 2.2505 |
| python_e2e | 2.6614 | 2.9622 | 3.2571 |
| python_core | 1.6909 | 1.7645 | 2.0544 |
| normalize | 0.9590 | 1.0488 | 1.2857 |
| python_ipc_encode | 0.2959 | 0.4523 | 0.5376 |
| python_ipc_decode | 0.1698 | 0.2302 | 0.3919 |
| native_profile_call | 0.0833 | 0.1238 | 0.1522 |
| rust_ipc_decode | 0.0157 | 0.0301 | 0.0447 |
| rust_core | 0.0479 | 0.0606 | 0.0688 |
| rust_ipc_encode | 0.0112 | 0.0241 | 0.0318 |
| conversion_total | 0.5034 | 0.7814 | 0.9076 |
dense-100k — 分层统计 / ms
| 阶段 | Min | Median | P95 |
|---|---|---|---|
| rust_e2e | 16.2412 | 17.0403 | 17.9192 |
| python_e2e | 205.8595 | 209.1555 | 214.3437 |
| python_core | 197.9344 | 199.3360 | 207.2388 |
| normalize | 7.4495 | 7.7815 | 8.4483 |
| python_ipc_encode | 0.9435 | 1.2309 | 1.3655 |
| python_ipc_decode | 0.4702 | 0.5528 | 0.7523 |
| native_profile_call | 7.0483 | 7.2905 | 7.4663 |
| rust_ipc_decode | 0.6601 | 0.7183 | 0.8888 |
| rust_core | 6.2471 | 6.5075 | 6.6971 |
| rust_ipc_encode | 0.0360 | 0.0411 | 0.0551 |
| conversion_total | 2.3325 | 2.5390 | 2.8324 |
dense-500k — 分层统计 / ms
| 阶段 | Min | Median | P95 |
|---|---|---|---|
| rust_e2e | 63.7729 | 68.5805 | 70.7208 |
| python_e2e | 1162.1901 | 1199.7927 | 1213.5771 |
| python_core | 1153.8702 | 1176.0042 | 1273.2021 |
| normalize | 23.2440 | 24.3454 | 26.0368 |
| python_ipc_encode | 4.4698 | 4.5612 | 5.0755 |
| python_ipc_decode | 0.3425 | 0.5198 | 0.7877 |
| native_profile_call | 35.7819 | 37.8151 | 38.9256 |
| rust_ipc_decode | 3.6118 | 3.6997 | 4.2053 |
| rust_core | 32.0814 | 34.1031 | 34.6761 |
| rust_ipc_encode | 0.0425 | 0.0474 | 0.0603 |
| conversion_total | 8.7055 | 8.8509 | 9.8016 |
sparse-1000-symbols — 分层统计 / ms
| 阶段 | Min | Median | P95 |
|---|---|---|---|
| rust_e2e | 14.9190 | 15.1485 | 15.4126 |
| python_e2e | 215.4547 | 217.4219 | 234.9833 |
| python_core | 207.7636 | 210.0207 | 212.1717 |
| normalize | 6.2292 | 7.3080 | 8.0323 |
| python_ipc_encode | 0.8119 | 0.9981 | 1.0465 |
| python_ipc_decode | 0.5650 | 0.6511 | 0.9319 |
| native_profile_call | 5.2993 | 6.1134 | 6.2363 |
| rust_ipc_decode | 0.4153 | 0.4389 | 0.4622 |
| rust_core | 4.7268 | 5.4838 | 5.6393 |
| rust_ipc_encode | 0.0946 | 0.1132 | 0.1426 |
| conversion_total | 1.9607 | 2.2152 | 2.5435 |
shuffled-duplicates — 分层统计 / ms
| 阶段 | Min | Median | P95 |
|---|---|---|---|
| rust_e2e | 10.5407 | 11.4866 | 11.6983 |
| python_e2e | 123.2557 | 125.5172 | 130.5692 |
| python_core | 117.3800 | 118.4904 | 149.4523 |
| normalize | 4.7355 | 5.7077 | 6.2642 |
| python_ipc_encode | 0.8550 | 0.8905 | 1.1839 |
| python_ipc_decode | 0.2330 | 0.4933 | 0.6347 |
| native_profile_call | 3.9673 | 4.1923 | 4.8083 |
| rust_ipc_decode | 0.3170 | 0.3386 | 0.4479 |
| rust_core | 3.4636 | 3.7982 | 4.4116 |
| rust_ipc_encode | 0.0387 | 0.0439 | 0.0505 |
| conversion_total | 1.5397 | 1.8430 | 2.1967 |
环境、构建与复现
{
"created_at": "2026-09-08T10:16:07.507600+00:00",
"seed": 721,
"repeats": 7,
"warmups": 2,
"platform": "macOS-26.6.2-arm64-arm-64bit",
"machine": "arm64",
"python": "3.12.13 (main, Mar 3 2026, 15:35:03) [Clang 21.1.4 ]",
"cpu": "Apple M1",
"packages": {
"numpy": "2.5.3",
"pandas": "3.0.2",
"pyarrow": "25.0.1",
"polars": "1.44.1",
"maturin": "1.15.0"
},
"rustc": "rustc 1.97.1 (8bab26f4f 2026-07-14)\nbinary: rustc\ncommit-hash: 8bab26f4f68e0e26f0bb7960be334d5b520ea452\ncommit-date: 2026-07-14\nhost: aarch64-apple-darwin\nrelease: 1.97.1\nLLVM version: 22.1.6",
"base_revision": "4a977385572f196ab7a42bcb3298f5c10204bd3d",
"source_sha256": {
"src/core/position_risk.rs": "e4e5cb8207c57a20be5cf3220ad6f6edb23c69119597ee84d2f6f0553e11b703",
"src/python.rs": "94c788e32ff4c798d446615cbfe9c8cca7453c5101c928c062091ac9bd7d8cd8",
"python/wbt/position_risk.py": "9c99f595ae8d5c08d2fbab3f860afd53f24f318bbddd76cef5b28dc20c702284",
"python/scripts/position_risk_reference.py": "0029701b2ad9c0d821bafcb926a2add534acaae8989f8dd43ed3d113e765c2b8",
"python/scripts/benchmark_position_risk.py": "a9882d0891dfee8f9370b79bab0b307fd46e4508ce61f4dcb96bde56f2804d49"
},
"extension_sha256": "4bb930174a765154e237880ab161bc84e246089b7e6551c6aa7e88a193031ac4",
"cargo_lock_sha256": "0ad0a1f57d4c9cc60fb9bf1dd470f459e111ae3412fd7e42f53f9385740d1603",
"build": "maturin develop --release; opt-level=3, lto=fat, codegen-units=1; debug assertions checked off",
"command": "python/scripts/benchmark_position_risk.py --seed 721 --repeats 7 --warmups 2 --output docs/benchmarks/position_risk"
}运行命令与锁定依赖见 docs/position_risk.md;JSON 保留全部原始样本。
内嵌完整 JSON(离线可审计)
{
"metadata": {
"created_at": "2026-09-08T10:16:07.507600+00:00",
"seed": 721,
"repeats": 7,
"warmups": 2,
"platform": "macOS-26.6.2-arm64-arm-64bit",
"machine": "arm64",
"python": "3.12.13 (main, Mar 3 2026, 15:35:03) [Clang 21.1.4 ]",
"cpu": "Apple M1",
"packages": {
"numpy": "2.5.3",
"pandas": "3.0.2",
"pyarrow": "25.0.1",
"polars": "1.44.1",
"maturin": "1.15.0"
},
"rustc": "rustc 1.97.1 (8bab26f4f 2026-07-14)\nbinary: rustc\ncommit-hash: 8bab26f4f68e0e26f0bb7960be334d5b520ea452\ncommit-date: 2026-07-14\nhost: aarch64-apple-darwin\nrelease: 1.97.1\nLLVM version: 22.1.6",
"base_revision": "4a977385572f196ab7a42bcb3298f5c10204bd3d",
"source_sha256": {
"src/core/position_risk.rs": "e4e5cb8207c57a20be5cf3220ad6f6edb23c69119597ee84d2f6f0553e11b703",
"src/python.rs": "94c788e32ff4c798d446615cbfe9c8cca7453c5101c928c062091ac9bd7d8cd8",
"python/wbt/position_risk.py": "9c99f595ae8d5c08d2fbab3f860afd53f24f318bbddd76cef5b28dc20c702284",
"python/scripts/position_risk_reference.py": "0029701b2ad9c0d821bafcb926a2add534acaae8989f8dd43ed3d113e765c2b8",
"python/scripts/benchmark_position_risk.py": "a9882d0891dfee8f9370b79bab0b307fd46e4508ce61f4dcb96bde56f2804d49"
},
"extension_sha256": "4bb930174a765154e237880ab161bc84e246089b7e6551c6aa7e88a193031ac4",
"cargo_lock_sha256": "0ad0a1f57d4c9cc60fb9bf1dd470f459e111ae3412fd7e42f53f9385740d1603",
"build": "maturin develop --release; opt-level=3, lto=fat, codegen-units=1; debug assertions checked off",
"command": "python/scripts/benchmark_position_risk.py --seed 721 --repeats 7 --warmups 2 --output docs/benchmarks/position_risk"
},
"cases": [
{
"name": "tiny",
"rows": 12,
"times": 4,
"symbols": 3,
"input_sha256": "453ddb7d0586e192cf9e8bb29bee6b395d2d0608cc41248c0dd9ca2cc2dd13d5",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 1.0265409982821438,
"min_ms": 0.8232079999288544,
"p95_ms": 1.3023044983128784,
"samples_seconds": [
0.0010265409982821438,
0.0010683330001484137,
0.0008666249996167608,
0.001246042000275338,
0.00094600000011269,
0.0013264169974718243,
0.0008232079999288544
]
},
"python_e2e": {
"median_ms": 0.9499579973635264,
"min_ms": 0.7763339999655727,
"p95_ms": 1.7911581006046613,
"samples_seconds": [
0.0013147499994374812,
0.0009393340005772188,
0.0007763339999655727,
0.001995333001104882,
0.0009041250013979152,
0.0011161250004079193,
0.0009499579973635264
]
},
"python_core": {
"median_ms": 0.5072080020909198,
"min_ms": 0.38270799996098503,
"p95_ms": 0.5402284983574646,
"samples_seconds": [
0.0005464159985422157,
0.0005072080020909198,
0.00040920800165622495,
0.0005172920027689543,
0.00044100000013713725,
0.0005257909979263786,
0.00038270799996098503
]
},
"normalize": {
"median_ms": 0.5153329984750599,
"min_ms": 0.43091599945910275,
"p95_ms": 1.2151287999586196,
"samples_seconds": [
0.0014701660002174322,
0.0004934169992338866,
0.0005235000026004855,
0.0005153329984750599,
0.0005137500011187512,
0.00043091599945910275,
0.0006200419993547257
]
},
"python_ipc_encode": {
"median_ms": 0.16070800120360218,
"min_ms": 0.1385000032314565,
"p95_ms": 0.2459829003782943,
"samples_seconds": [
0.0001385000032314565,
0.0001925409997056704,
0.00014400000145542435,
0.00015845900270505808,
0.00016070800120360218,
0.00025608299984014593,
0.0002224160016339738
]
},
"python_ipc_decode": {
"median_ms": 0.22725000235368498,
"min_ms": 0.19258300017099828,
"p95_ms": 1.288000098793417,
"samples_seconds": [
0.0017116249982791487,
0.00022725000235368498,
0.00019258300017099828,
0.00021691599977202713,
0.00022008299856679514,
0.00029954199999338016,
0.0002979580021928996
]
},
"native_profile_call": {
"median_ms": 0.04629199975170195,
"min_ms": 0.03399999695830047,
"p95_ms": 0.07375019922619686,
"samples_seconds": [
4.629199975170195e-05,
3.399999695830047e-05,
4.149999949731864e-05,
3.454200123087503e-05,
5.145899922354147e-05,
7.083399759721942e-05,
7.499999992433004e-05
]
},
"rust_ipc_decode": {
"median_ms": 0.015291999999999998,
"min_ms": 0.009708,
"p95_ms": 0.026549800000000002,
"samples_seconds": [
1.5292e-05,
9.708e-06,
1.3791e-05,
1.0375e-05,
1.8375e-05,
2.4916e-05,
2.725e-05
]
},
"rust_core": {
"median_ms": 0.00775,
"min_ms": 0.0053750000000000004,
"p95_ms": 0.013149899999999999,
"samples_seconds": [
7.709e-06,
5.75e-06,
7.75e-06,
5.375e-06,
9.084e-06,
1.2333e-05,
1.35e-05
]
},
"rust_ipc_encode": {
"median_ms": 0.018458,
"min_ms": 0.01425,
"p95_ms": 0.0276287,
"samples_seconds": [
1.8458e-05,
1.425e-05,
1.6042e-05,
1.4666e-05,
2.0375e-05,
2.6375e-05,
2.8166e-05
]
},
"conversion_total": {
"median_ms": 0.44374900205935536,
"min_ms": 0.3664160016264226,
"p95_ms": 1.5007873010074806,
"samples_seconds": [
0.0018838750015106051,
0.00044374900205935535,
0.0003664160016264226,
0.0004004160024770852,
0.0004195409997703973,
0.0006069159998335261,
0.0005757900038268733
]
}
},
"e2e_speedup": 0.925397036215042,
"core_speedup": 65.44619381818319
},
{
"name": "small-dense",
"rows": 1000,
"times": 100,
"symbols": 10,
"input_sha256": "92559bbdbb896712cc1a57bc8b1add5ee746d81dffe8004954803e3a60cc8408",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 1.9156249982188456,
"min_ms": 1.5762910006742459,
"p95_ms": 2.250470698345452,
"samples_seconds": [
0.0017358750010316726,
0.0019156249982188456,
0.002025041998422239,
0.002347082998312544,
0.0017714169989631046,
0.0015762910006742459,
0.0020138750005571637
]
},
"python_e2e": {
"median_ms": 2.9621670000778977,
"min_ms": 2.6614159978635143,
"p95_ms": 3.2571079984336393,
"samples_seconds": [
0.0029621670000778977,
0.0032700829979148693,
0.0030149169979267754,
0.0032268329996441025,
0.002886624999518972,
0.002663333001692081,
0.0026614159978635143
]
},
"python_core": {
"median_ms": 1.764458000252489,
"min_ms": 1.6908750003494788,
"p95_ms": 2.0544419003272196,
"samples_seconds": [
0.0019040000006498303,
0.002118917000188958,
0.001713208999717608,
0.001764458000252489,
0.0017899579979712144,
0.0017452499996579718,
0.0016908750003494788
]
},
"normalize": {
"median_ms": 1.0487910003575962,
"min_ms": 0.9589999972376972,
"p95_ms": 1.2857036999776028,
"samples_seconds": [
0.0010779999975056853,
0.0009589999972376972,
0.0010487910003575962,
0.0012592500024766196,
0.0012970409989065956,
0.0010092080010508653,
0.0009827499998209532
]
},
"python_ipc_encode": {
"median_ms": 0.4522500021266751,
"min_ms": 0.29591699785669334,
"p95_ms": 0.537608700687997,
"samples_seconds": [
0.0005134580023877788,
0.00029591699785669334,
0.00034720899930107407,
0.0004522500021266751,
0.00045679200047743507,
0.0003233339994039852,
0.0005479589999595191
]
},
"python_ipc_decode": {
"median_ms": 0.23024999973131344,
"min_ms": 0.16975000107777305,
"p95_ms": 0.3918961992894765,
"samples_seconds": [
0.0003669580000860151,
0.00017629099966143258,
0.0004025839989481028,
0.000258708001638297,
0.00023024999973131344,
0.00016975000107777305,
0.0002175839981646277
]
},
"native_profile_call": {
"median_ms": 0.12375000005704351,
"min_ms": 0.0832920013635885,
"p95_ms": 0.15222889960568864,
"samples_seconds": [
0.0001237500000570435,
8.32920013635885e-05,
9.029200009535998e-05,
0.0001485840002715122,
8.59159990795888e-05,
0.00013899999976274557,
0.00015379099932033569
]
},
"rust_ipc_decode": {
"median_ms": 0.030083,
"min_ms": 0.015667,
"p95_ms": 0.0447419,
"samples_seconds": [
3.0083e-05,
1.6208e-05,
1.6875e-05,
4.2e-05,
1.5667e-05,
3.6834e-05,
4.5917e-05
]
},
"rust_core": {
"median_ms": 0.060625000000000005,
"min_ms": 0.047875,
"p95_ms": 0.0687875,
"samples_seconds": [
6.0625e-05,
4.7875e-05,
5.4209e-05,
6.7625e-05,
5.5e-05,
6.9125e-05,
6.8e-05
]
},
"rust_ipc_encode": {
"median_ms": 0.024083,
"min_ms": 0.011208000000000001,
"p95_ms": 0.031849999999999996,
"samples_seconds": [
2.4083e-05,
1.4958e-05,
1.4709e-05,
2.8875e-05,
1.1208e-05,
2.6083e-05,
3.3125e-05
]
},
"conversion_total": {
"median_ms": 0.7813769982491768,
"min_ms": 0.503373997518126,
"p95_ms": 0.9075829011688998,
"samples_seconds": [
0.000934582002473794,
0.0005033739975181259,
0.0007813769982491769,
0.0007818330037649721,
0.0007139170002087485,
0.0005560010004817583,
0.0008445849981241468
]
}
},
"e2e_speedup": 1.54631882692705,
"core_speedup": 29.104461859834867
},
{
"name": "dense-100k",
"rows": 100000,
"times": 1000,
"symbols": 100,
"input_sha256": "b92a47263827f79f31c7d6538323fa68f4925f3df251b52f04645ef0f23c8ecd",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 17.040250000718515,
"min_ms": 16.241249999438878,
"p95_ms": 17.91919129755115,
"samples_seconds": [
0.017686791998130502,
0.016241249999438878,
0.017040250000718515,
0.016316791999997804,
0.01718208300007973,
0.018018790997302858,
0.01670975000160979
]
},
"python_e2e": {
"median_ms": 209.1555420010991,
"min_ms": 205.8595000016794,
"p95_ms": 214.3436873993778,
"samples_seconds": [
0.2091555420010991,
0.20664291600041906,
0.20924229199954425,
0.2058595000016794,
0.21338920800189953,
0.20746312499977648,
0.21475274999829708
]
},
"python_core": {
"median_ms": 199.3359580010292,
"min_ms": 197.93441699948744,
"p95_ms": 207.23882070051332,
"samples_seconds": [
0.20610216700151796,
0.20772595800008276,
0.1979922919999808,
0.1983958340024401,
0.2000791249993199,
0.19793441699948744,
0.1993359580010292
]
},
"normalize": {
"median_ms": 7.781541997246677,
"min_ms": 7.449459000781644,
"p95_ms": 8.44830019850633,
"samples_seconds": [
0.007770750002237037,
0.007781541997246677,
0.008086833000561455,
0.007721875001152512,
0.008208958999603055,
0.008550874998036306,
0.007449459000781644
]
},
"python_ipc_encode": {
"median_ms": 1.2309170015214477,
"min_ms": 0.9434589992451947,
"p95_ms": 1.3654668007802684,
"samples_seconds": [
0.0013069579981674906,
0.0012309170015214477,
0.0009434589992451947,
0.0011531250020198058,
0.0012348750024102628,
0.0013905420019000303,
0.0009669589999248274
]
},
"python_ipc_decode": {
"median_ms": 0.5528330002562143,
"min_ms": 0.47020900092320517,
"p95_ms": 0.7523248987126862,
"samples_seconds": [
0.0004980000012437813,
0.0005528330002562143,
0.000641957998595899,
0.0004796250032086391,
0.0006028749994584359,
0.000799624998762738,
0.00047020900092320517
]
},
"native_profile_call": {
"median_ms": 7.290458997886162,
"min_ms": 7.048291001410689,
"p95_ms": 7.46630819994607,
"samples_seconds": [
0.007445541999913985,
0.007283458999154391,
0.007048291001410689,
0.00741458299671649,
0.007475207999959821,
0.0070940000005066395,
0.007290458997886162
]
},
"rust_ipc_decode": {
"median_ms": 0.71825,
"min_ms": 0.660083,
"p95_ms": 0.8888124999999999,
"samples_seconds": [
0.0006875,
0.00071825,
0.000749416,
0.000660083,
0.000757125,
0.000667709,
0.00094525
]
},
"rust_core": {
"median_ms": 6.5075,
"min_ms": 6.2471250000000005,
"p95_ms": 6.6970543000000005,
"samples_seconds": [
0.006692708,
0.0065075,
0.006247125,
0.006698917,
0.006661958,
0.006348916,
0.006275708
]
},
"rust_ipc_encode": {
"median_ms": 0.041083,
"min_ms": 0.035958,
"p95_ms": 0.05508729999999999,
"samples_seconds": [
4.6541e-05,
4.1375e-05,
3.5958e-05,
3.9625e-05,
4.1083e-05,
5.875e-05,
4.0333e-05
]
},
"conversion_total": {
"median_ms": 2.538998999411272,
"min_ms": 2.3324580052284447,
"p95_ms": 2.832425601024547,
"samples_seconds": [
0.002538998999411272,
0.002543375001777662,
0.002370790997841094,
0.0023324580052284448,
0.0026359580018686986,
0.0029166260006627683,
0.0024227510008480325
]
}
},
"e2e_speedup": 12.27420618783644,
"core_speedup": 30.631726162278788
},
{
"name": "dense-500k",
"rows": 500000,
"times": 2000,
"symbols": 250,
"input_sha256": "d7a01b79ea334543a16c208971864854ccf7214e7470e6a13ccceda48b9d064c",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 68.58045800254331,
"min_ms": 63.77287499708473,
"p95_ms": 70.72082119884726,
"samples_seconds": [
0.06560012499903678,
0.06377287499708473,
0.06796170799862011,
0.06859554200127604,
0.06947683299949858,
0.06858045800254331,
0.07125395899856812
]
},
"python_e2e": {
"median_ms": 1199.7927080010413,
"min_ms": 1162.1900829995866,
"p95_ms": 1213.5771126027976,
"samples_seconds": [
1.1621900829995866,
1.1880060830008006,
1.1909050829999615,
1.1997927080010413,
1.2017713750028634,
1.213201417001983,
1.2137381250031467
]
},
"python_core": {
"median_ms": 1176.0042079986306,
"min_ms": 1153.8701659992512,
"p95_ms": 1273.2020586001454,
"samples_seconds": [
1.1538701659992512,
1.307592459001171,
1.1706380420000642,
1.1760042079986306,
1.1737338750026538,
1.1929577909977525,
1.1867569579990231
]
},
"normalize": {
"median_ms": 24.34541600086959,
"min_ms": 23.243958999955794,
"p95_ms": 26.03684199893905,
"samples_seconds": [
0.023243958999955794,
0.02434541600086959,
0.02390137499969569,
0.02434854100283701,
0.02440566699806368,
0.026735916999314213,
0.024201292002544506
]
},
"python_ipc_encode": {
"median_ms": 4.561249999824213,
"min_ms": 4.4698329984385055,
"p95_ms": 5.075478800790734,
"samples_seconds": [
0.004561249999824213,
0.004724166999949375,
0.005226041001151316,
0.0044702909981424455,
0.0044778330011467915,
0.0044698329984385055,
0.004612500000803266
]
},
"python_ipc_decode": {
"median_ms": 0.5197919999773148,
"min_ms": 0.3424580027058255,
"p95_ms": 0.7876669995312112,
"samples_seconds": [
0.00046137500248732977,
0.0005197919999773148,
0.0005805840009998064,
0.0006187919971125666,
0.0005194580007810146,
0.0003424580027058255,
0.0008600420005677734
]
},
"native_profile_call": {
"median_ms": 37.815125000634,
"min_ms": 35.781916998530505,
"p95_ms": 38.92561240099894,
"samples_seconds": [
0.03637391699885484,
0.035781916998530505,
0.03857558299932862,
0.03777766699931817,
0.037815125000634,
0.038224957999773324,
0.0390756250017148
]
},
"rust_ipc_decode": {
"median_ms": 3.699667,
"min_ms": 3.611834,
"p95_ms": 4.2052918,
"samples_seconds": [
0.003623,
0.003634875,
0.003921208,
0.003611834,
0.003699667,
0.003991208,
0.004297042
]
},
"rust_core": {
"median_ms": 34.103083999999996,
"min_ms": 32.081375,
"p95_ms": 34.6760921,
"samples_seconds": [
0.0326665,
0.032081375,
0.034584334,
0.034103084,
0.033993584,
0.034167583,
0.034715417
]
},
"rust_ipc_encode": {
"median_ms": 0.047375,
"min_ms": 0.042457999999999996,
"p95_ms": 0.0603419,
"samples_seconds": [
5.9875e-05,
4.5959e-05,
4.9542e-05,
4.5792e-05,
6.0542e-05,
4.7375e-05,
4.2458e-05
]
},
"conversion_total": {
"median_ms": 8.850874001144332,
"min_ms": 8.705500002311544,
"p95_ms": 9.801641901605063,
"samples_seconds": [
0.008705500002311543,
0.008924792999926691,
0.009777375002151123,
0.008746708995255013,
0.008757500001927807,
0.008850874001144331,
0.009812042001371039
]
}
},
"e2e_speedup": 17.4946733070308,
"core_speedup": 34.48380820921154
},
{
"name": "sparse-1000-symbols",
"rows": 60000,
"times": 20000,
"symbols": 1000,
"input_sha256": "1d91a022076342e0ab39b80b3671331a82224f4228463e33c7304656559bce4d",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 15.148500002396759,
"min_ms": 14.918957996997051,
"p95_ms": 15.412579401163384,
"samples_seconds": [
0.014971874999901047,
0.015054207997309277,
0.015451667000888847,
0.014918957996997051,
0.015321375001803972,
0.015148500002396759,
0.01527462500234833
]
},
"python_e2e": {
"median_ms": 217.4219170010474,
"min_ms": 215.45466699899407,
"p95_ms": 234.98334609976155,
"samples_seconds": [
0.24217458400016767,
0.21565241599819274,
0.21611354199922062,
0.21820379099881393,
0.21545466699899407,
0.21782470800098963,
0.2174219170010474
]
},
"python_core": {
"median_ms": 210.0207080002292,
"min_ms": 207.76358299917774,
"p95_ms": 212.1716542987997,
"samples_seconds": [
0.20776358299917774,
0.21208645799924852,
0.21220816699860734,
0.2090936659988074,
0.2100207080002292,
0.21156979099760065,
0.2090314170018246
]
},
"normalize": {
"median_ms": 7.308041000214871,
"min_ms": 6.229167000128655,
"p95_ms": 8.032329300112906,
"samples_seconds": [
0.007308041000214871,
0.006229167000128655,
0.0075593750007101335,
0.006979750000027707,
0.008227541999076493,
0.0066600829995877575,
0.0075768330025312025
]
},
"python_ipc_encode": {
"median_ms": 0.9980830000131391,
"min_ms": 0.8118749974528328,
"p95_ms": 1.0464838000189047,
"samples_seconds": [
0.0010311250007362105,
0.0009561250008118805,
0.001051084000209812,
0.0008118749974528328,
0.0010357499995734543,
0.000998083000013139,
0.0008355410027434118
]
},
"python_ipc_decode": {
"median_ms": 0.6511249994218815,
"min_ms": 0.5649579979944974,
"p95_ms": 0.9318829976109553,
"samples_seconds": [
0.0006097910008975305,
0.0005649579979944974,
0.00101258299764595,
0.000616332999925362,
0.0007102919989847578,
0.0007435829975293018,
0.0006511249994218815
]
},
"native_profile_call": {
"median_ms": 6.113375002314569,
"min_ms": 5.299291999108391,
"p95_ms": 6.23626240012527,
"samples_seconds": [
0.006113375002314569,
0.00623687500046799,
0.00623483299932559,
0.005299291999108391,
0.005837792003148934,
0.005848917000548681,
0.006231291998119559
]
},
"rust_ipc_decode": {
"median_ms": 0.43891600000000003,
"min_ms": 0.41525,
"p95_ms": 0.4622455,
"samples_seconds": [
0.000443958,
0.00041525,
0.000438916,
0.000437958,
0.000470083,
0.000442417,
0.000422041
]
},
"rust_core": {
"median_ms": 5.483833,
"min_ms": 4.726833,
"p95_ms": 5.6392587999999995,
"samples_seconds": [
0.005483833,
0.005651959,
0.005599333,
0.004726833,
0.005195292,
0.005251791,
0.005609625
]
},
"rust_ipc_encode": {
"median_ms": 0.11316699999999999,
"min_ms": 0.094583,
"p95_ms": 0.1425999,
"samples_seconds": [
0.000130292,
0.000113167,
0.000133208,
9.4583e-05,
0.000111958,
0.000104083,
0.000146625
]
},
"conversion_total": {
"median_ms": 2.215166001633741,
"min_ms": 1.9607489973781949,
"p95_ms": 2.543478598066497,
"samples_seconds": [
0.002215166001633741,
0.0020494999988063776,
0.0026357909978557623,
0.001960748997378195,
0.0023280829985582122,
0.002288165997542441,
0.002055332002165293
]
}
},
"e2e_speedup": 14.352702707637551,
"core_speedup": 38.29815897023655
},
{
"name": "shuffled-duplicates",
"rows": 44000,
"times": 2000,
"symbols": 100,
"input_sha256": "ae112574398e82c231be0a28d78fe5107877104321605ec991feceb47b9b06fa",
"max_abs_error": 0.0,
"measurements": {
"rust_e2e": {
"median_ms": 11.486625000543427,
"min_ms": 10.540666997258086,
"p95_ms": 11.698274999071145,
"samples_seconds": [
0.011486625000543427,
0.010540666997258086,
0.011657499999273568,
0.010611333000269951,
0.011654874997475417,
0.011189917000592686,
0.011715749998984393
]
},
"python_e2e": {
"median_ms": 125.51724999866565,
"min_ms": 123.25570800021524,
"p95_ms": 130.56915020060842,
"samples_seconds": [
0.13230800000019372,
0.12620462499762652,
0.1251406669980497,
0.12651183400157606,
0.12334308400022564,
0.12551724999866565,
0.12325570800021524
]
},
"python_core": {
"median_ms": 118.49037499996484,
"min_ms": 117.37995799921919,
"p95_ms": 149.45228750038947,
"samples_seconds": [
0.11821224999948754,
0.11782408400176791,
0.16107462500076508,
0.12233349999951315,
0.11849037499996484,
0.12070308300098986,
0.11737995799921919
]
},
"normalize": {
"median_ms": 5.70766700184322,
"min_ms": 4.735542002890725,
"p95_ms": 6.264158201156533,
"samples_seconds": [
0.005232792002061615,
0.006308083000476472,
0.005972249997284962,
0.006161667002743343,
0.00570766700184322,
0.005512209001608426,
0.004735542002890725
]
},
"python_ipc_encode": {
"median_ms": 0.8904579990485217,
"min_ms": 0.8550419988750946,
"p95_ms": 1.1839499024063111,
"samples_seconds": [
0.0008904579990485217,
0.001286000002437504,
0.0009372499989694916,
0.0009458330023335293,
0.0008879580018401612,
0.0008799159986665472,
0.0008550419988750946
]
},
"python_ipc_decode": {
"median_ms": 0.49325000145472586,
"min_ms": 0.23300000248127617,
"p95_ms": 0.6347081012791023,
"samples_seconds": [
0.0006379580008797348,
0.0005181669985176995,
0.0004932500014547259,
0.00023300000248127617,
0.0004899160012428183,
0.0004892500001005828,
0.0006271250022109598
]
},
"native_profile_call": {
"median_ms": 4.192291999061126,
"min_ms": 3.967334003391443,
"p95_ms": 4.808274898459786,
"samples_seconds": [
0.004194791999907466,
0.003997916999651352,
0.003995291997853201,
0.004192291999061126,
0.004917374997603474,
0.004553708000457846,
0.003967334003391443
]
},
"rust_ipc_decode": {
"median_ms": 0.338625,
"min_ms": 0.317,
"p95_ms": 0.44791269999999994,
"samples_seconds": [
0.000338625,
0.000477625,
0.000373167,
0.000317,
0.00032625,
0.00032925,
0.000378584
]
},
"rust_core": {
"median_ms": 3.79825,
"min_ms": 3.463584,
"p95_ms": 4.4116045999999995,
"samples_seconds": [
0.00379825,
0.003463584,
0.003566709,
0.00381,
0.004523417,
0.004150709,
0.003522666
]
},
"rust_ipc_encode": {
"median_ms": 0.043875000000000004,
"min_ms": 0.038708,
"p95_ms": 0.050454599999999995,
"samples_seconds": [
4.0875e-05,
3.8708e-05,
3.9292e-05,
4.3875e-05,
4.8209e-05,
5.1417e-05,
4.5958e-05
]
},
"conversion_total": {
"median_ms": 1.8429590004242173,
"min_ms": 1.5397080048148055,
"p95_ms": 2.196724800647119,
"samples_seconds": [
0.0019079159999282566,
0.0023205000009552034,
0.0018429590004242174,
0.0015397080048148055,
0.0017523330030829794,
0.00174983299876713,
0.0019067090010860543
]
}
},
"e2e_speedup": 10.927252347206206,
"core_speedup": 31.196044230886553
}
]
}