gnr.core.gnrbag vs genro_bag vs replacement wrapper — Aprile 2026
687
Test Analysis
1588
Test Core
100%
Readiness
35/35
Wrapper = Original
9
Aree API
Matrice di Compatibilita
Area
Original
New
Wrapper
A: Access & Mutation
5/5
4/4
5/5
B: Iteration
4/4
4/4
4/4
C: Query & Traversal
4/4
1/1
4/4
D: Serialization
4/4
3/3
4/4
E: Events
3/3
3/3
3/3
F: Hierarchy
4/4
2/2
4/4
G: Resolvers
2/2
2/2
2/2
H: BagNode API
4/4
2/2
4/4
I: Utilities
5/5
3/3
5/5
TOTALE
35/35
24/24
35/35
Zero skip, zero xfail. New ha meno test perche i test camelCase non si applicano.
Performance Benchmarks
Piu veloce (barra verde, < 1.0x)
Piu lento (barra rossa, > 1.0x)
Neutro (~1.0x)
1. Creazione
Operazione
Original (ms)
New (ms)
Wrapper (ms)
New/Orig
Empty Bag
0.12
0.14
0.20
1.15x
100 items
140.83
69.01
96.30
0.49x
1000 items
1202.22
139.97
194.45
0.12x
2. Accesso
Operazione
Original (ms)
New (ms)
Wrapper (ms)
New/Orig
Scalar key
3.00
2.06
2.22
0.69x
Nested path (a.b.c)
2.62
5.68
5.57
2.17x
Positional #50
1.18
2.30
2.70
1.95x
3. Mutazione
Operazione
Original (ms)
New (ms)
Wrapper (ms)
New/Orig
Set existing key
3.75
1.55
1.58
0.41x
Set + pop
11.03
17.31
9.30
1.57x
Set attr
4.07
4.89
5.66
1.20x
4. Iterazione
Operazione
Original (ms)
New (ms)
Wrapper (ms)
New/Orig
keys()
0.60
0.60
0.54
1.00x
values()
2.68
2.41
2.47
0.90x
items()
3.27
2.92
2.92
0.89x
len()
0.11
0.20
0.20
1.70x
for loop
0.20
0.23
0.20
1.13x
5. Serializzazione
Operazione
Original (ms)
New (ms)
Wrapper (ms)
New/Orig
to_xml
9.12
5.31
7.27
0.58x
from_xml
19.72
16.63
36.67
0.84x
to_json
3.03
3.93
3.50
1.30x
from_json
58.79
13.02
22.36
0.22x
pickle dumps
3.62
6.38
7.06
1.76x
pickle loads
5.12
4.66
5.77
0.91x
6. Scaling (lookup & contains per dimensione bag)
Operazione
Original (ms)
New (ms)
Wrapper (ms)
New/Orig
lookup n=10
1.77
3.50
2.65
1.98x
lookup n=100
5.09
1.85
1.86
0.36x
lookup n=1000
45.05
2.56
2.55
0.06x
contains n=10
1.72
3.35
2.72
1.95x
contains n=100
4.36
5.02
5.78
1.15x
contains n=1000
42.00
46.47
44.01
1.11x
Scaling: Lookup n=1000 e 18x piu veloce dell'originale (O(1) dict vs O(n) list scan).
Su bag piccole (n=10) l'overhead fisso del traversal domina, risultando ~2x piu lento.
Il crossover e intorno a n=50-100.
Dove Resta Piu Lento (e perche)
Operazione
Rapporto
Causa
Impatto reale
nested_path (a.b.c)
2.17x
Full pipeline _htraverse con smartsplit + smartcontinuation x2
~1.5 µs/op — trascurabile
positional #50
1.95x
smartcontinuation x2 + bag.get() overhead sui chiamanti
~0.6 µs/op — trascurabile
set+pop
1.57x
Doppia _htraverse (una per set, una per pop)
~3 µs/op — trascurabile
lookup/contains n=10
~2x
Overhead fisso domina su bag piccole (crossover ~n=50)
~0.9 µs/op — trascurabile
pickle dumps
1.76x
BagNode ha piu slot, _dict serializzato ridondante
Basso volume, non critico
Ottimizzazioni Applicate
genro-bag: _htraverse fast path
Principio: in _htraverse, se il path non contiene . (single segment),
restituisce (self, path) immediatamente, bypassando la pipeline completa
(_htraverse_before → smartsplit → _traverse_inner → smartcontinuation).
Questo copre chiavi semplici, #N, #attr=val e key?attr.
Tutti i chiamanti (get_item, set_item, pop, get_node, set_attr, __contains__)
ne beneficiano senza duplicazione di logica.
genro-bag: altre ottimizzazioni
Intervento
Dettaglio
Rimozione cast()
Rimossi 20 cast() da 6 file. Ogni cast() costava ~44 ns a runtime. Risolto anche un NameError in _query.py (BagNode non definito a runtime con TYPE_CHECKING).
Inline smartsplit
Logica di smartsplit inlined in _htraverse_before per evitare overhead di chiamata funzione. Rimosso import.
1.from gnr.core.gnrbag import Bag → from replacement.gnrbag import Bag Zero modifiche al codice applicativo. API camelCase funziona identica.
2.
Aggiornamento graduale: setItem → set_item, getNode → get_node, etc. Il wrapper supporta entrambe le API simultaneamente.
3.from replacement.gnrbag import Bag → from genro_bag import Bag Rimozione del wrapper. Solo API snake_case.
Limitazioni Note
Area
Dettaglio
Impatto
Label duplicate
Suffissi interni + _display_label per dict key
Output identico, storage diverso
Validatori
BagValidationList non reimplementato
Stub con DeprecationWarning
__eq__ semantics
Originale ignora label, nuovo confronta label + valori
Basso
copy()
Originale ha bug (condivide _nodes). Wrapper corretto
Wrapper migliore
Conclusione
Il wrapper replacement.gnrbag e un drop-in replacement completo di gnr.core.gnrbag.
687 test analysis + 1588 test core, tutti verdi.
Profilo prestazionale favorevole nei casi d'uso tipici Genropy:
accesso scalare 1.5x piu veloce, set existing 2.4x piu veloce,
creazione bag 2–8x piu veloce, lookup/contains su bag medie-grandi fino a 18x piu veloce,
serializzazione XML/JSON 1.2–4.5x piu veloce.
Le operazioni piu lente (nested path 2.2x, positional 2.0x, set+pop 1.6x) hanno overhead assoluto < 3 µs/op,
non percepibile in uso reale. Il pickle (1.8x) e a basso volume.
La migrazione puo procedere in modo sicuro e incrementale.