hardbyte / hardbyte/python-common-expression-language

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

Abierto
#57 0 comentarios 0 reacciones 0 asignados Ver en GitHub
enhancement
Lenguaje dominante
Python
Estrellas
43
Forks
4
Merge medio
9 h 57 min
PR fusionados (30 d)
14

Descripción

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).

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python, rust
Área
documentation, performance, release, testing
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Activo
Claridad
Bastante claro
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.