hardbyte / hardbyte/python-common-expression-language

Comprehension macros are O(n²) in cel-rust 0.14.5; upstream fix for `map` is on master

Ouverte
#57 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
enhancement
Langage dominant
Python
Étoiles
43
Forks
4
Merge moyen
9 h 57 min
PR mergées (30 j)
14

Description

Found while benchmarking for #45. Executing `items.filter(i, i % 3 == 0).map(i, i * i).size()` against a `Context` holding an `int` list scales quadratically with the list length (release build, min of repeats):

| elements | time per execute |
|---:|---:|
| 1,000 | 17 ms |
| 2,000 | 66 ms |
| 4,000 | 251 ms |
| 8,000 | 940 ms |
| 20,000 | 5.8 s |

Each doubling costs ~4×. cel-rust 0.14.5's comprehension macros rebuild the accumulator list on every append (`Value::List` is an `Arc>`, so appending clones the vector), which makes `map`/`filter` over anything beyond a few thousand elements unusable. Nothing in this wrapper contributes; a dict context and a `Context` behave identically.

Upstream already has the fix for `map` on master, unreleased: cel-rust/cel-rust#341 "perf(macros): `map` mutates `List` in place" (merged 2026-09-13, on top of "perf(map): Added mutable `List` used in `map`"). It is not clear from the PR title whether `filter`, `all`, `exists` and `exists_one` got the same treatment.

## To do

- When the next cel-rust release (0.14.6 or 0.15) ships, bump and re-run the table above; add a test in `tests/test_performance_verification.py` that pins a comprehension over a 10,000-element list under a generous bound (say 200 ms) so a regression is caught.
- If `filter` is still quadratic after the bump, raise it upstream with the numbers.
- Until then the standard-library reference should say that comprehensions over large lists are slow in the current cel-rust, since policy engines routinely filter lists of thousands of records.

Benchmark script: the `cs`/`c` cases in the #45 prototype's `bench.py` (measured on 4 cores).

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Wait for cel-rust 0.14.6 or 0.15, then bump it and rerun the cs/c cases in the #45 prototype's bench.py. Check whether the upstream map fix also covers filter, all, exists, and exists_one; add the 10,000-element performance check in tests/test_performance_verification.py and update the standard-library reference if large-list comprehensions remain slow.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python, rust
Domaine
documentation, performance, release, testing
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Active
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.