NumWorks Omega 1.21 : 100K de heap pour scripts Python !
Posted: 29 Apr 2021, 20:59
Les interpréteurs MicroPython ou similaires qui tournent sur nos calculatrices font appel à différents types de mémoires :
Tout ceci pour dire que la mémoire heap sera très souvent le facteur limitant lors de tes projets Python sur calculatrices.
Afin de te permettre de choisir ton modèle en toute connaissance de cause, nous t'avions déjà communiqué un classement des différents modèles Python par capacité heap :
- La mémoire de stockage, qui contient physiquement tes scripts prêts à l'emploi.
- La pile (stack) qui référence, à l'exécution, les objets Python créés. Sa capacité limite donc le nombre d'objets Python pouvant coexister simultanément en mémoire.
- Le tas (heap) qui stocke, à l'exécution, le contenu des objets Python créés. Il limite donc la taille globale utilisée pour les données de ces différents objets.
Tout ceci pour dire que la mémoire heap sera très souvent le facteur limitant lors de tes projets Python sur calculatrices.
Afin de te permettre de choisir ton modèle en toute connaissance de cause, nous t'avions déjà communiqué un classement des différents modèles Python par capacité heap :
- 252,1 Mo : HP Prime G2
- 15,6 Mo : HP Prime G1
- 2,068 Mo : TI-Nspire CX II
- 1,033 Mo : Casio Graph 90+E
- 101,262 Ko : Casio Graph 35+E II
- 33,545 Ko : NumWorks
- 18,354 Ko : TI-83 Premium CE Edition Python
- 252,1 Mo : HP Prime G2
- 15,6 Mo : HP Prime G1
- 2,068 Mo : TI-Nspire CX II
- 1,033 Mo : Casio Graph 90+E / fx-CG50
- 101,262 Ko : Casio Graph 35+E II / fx-9750/9860GIII
- 33,545 Ko : NumWorks
- 20,839 Ko : TI-83 Premium CE + TI-Python
- 18,354 Ko : TI-83 Premium CE Edition Python / TI-84 Plus CE Python Edition
- 252,1 Mo : HP Prime G2
- 15,6 Mo : HP Prime G1
- 4,100 Mo : TI-Nspire CX / CX II (Ndless + KhiCAS CX / KhiCAS CX II)
- 2,068 Mo : TI-Nspire CX II
- 2,050 Mo : TI-Nspire (Ndless + MicroPython)
- 1,033 Mo : Casio Graph 90+E / fx-CG50
- 258,766 Ko : Casio Graph 35/75+E / 35/75/95 / fx-9750/9860GII (SH4 - appli CasioPython)
- 101,262 Ko : Casio Graph 35+E II / fx-9750/9860GIII
- 64,954 Ko : NumWorks (firmware Omega + appli KhiCAS)
- 33,545 Ko : NumWorks
- 32,648 Ko : Casio Graph 35+E II / 35/75/85/95(SH3) / fx-9750/9860GIII / fx-9750/9860GII(SH3) / fx-9860G (appli CasioPython)
- 23,685 Ko : TI-83 Premium CE + TI-Python (firmware tiers)
- 20,839 Ko : TI-83 Premium CE + TI-Python
- 18,354 Ko : TI-83 Premium CE Edition Python / TI-84 Plus CE Python Edition
De nouveaux éléments concernant la NumWorks nécessitent aujourd'hui la mise à jour de ce classement : une bonne et une mauvaise nouvelle. Commençons par la mauvaise.
Sur NumWorks N0110, tu as la possibilité d'installer KhiCAS, une application t'offrant un environnement intégré de Mathématiques et de Sciences développé par Bernard Parisse, enseignant-chercheur à l'Université de Grenoble, en parallèle de son logiciel Xcas pour ordinateur. Elle intègre nombre de choses : moteur de calcul formel GIAC, bibliothèques d'unités et de constantes physiques, application tableur, application de tableau périodique des éléments, langages de programmation Python et Xcas, ...
Le firmware officiel ne gérant pas les applications additionnelles, pour l'installer il te fallait commencer par passer ta calculatrice sous un firmware tiers, comme par exemple Omega. Or, l'application KhiCAS distribuée sur la page du firmware tiers Omega est sûrement suffisante pour nombre de choses, mais n'est pas stable.
Si tu es un utilisateur exigeant de KhiCAS, il te faut une version aussi fiable que possible et elle existe ; il te suffit de prendre l'application KhiCAS distribuée pour Delta, un autre firmware tiers.
Mise à part la gestion des applications, Delta apporte beaucoup moins d'améliorations qu'Omega, et malheureusement ces deux éditions de l'application KhiCAS ne sont pas interchangeables. En attendant une éventuelle résolution du problème, nous nous devons donc de tenir compte de Delta au classement.
D'autre part, nous ne l'avions pas remarqué mais Omega a changé la capacité du heap Python à compter de sa version 1.21 un peu plus tôt cette année...
Alors découvrons tout cela sans plus attendre.
Sur NumWorks N0110, tu as la possibilité d'installer KhiCAS, une application t'offrant un environnement intégré de Mathématiques et de Sciences développé par Bernard Parisse, enseignant-chercheur à l'Université de Grenoble, en parallèle de son logiciel Xcas pour ordinateur. Elle intègre nombre de choses : moteur de calcul formel GIAC, bibliothèques d'unités et de constantes physiques, application tableur, application de tableau périodique des éléments, langages de programmation Python et Xcas, ...
Le firmware officiel ne gérant pas les applications additionnelles, pour l'installer il te fallait commencer par passer ta calculatrice sous un firmware tiers, comme par exemple Omega. Or, l'application KhiCAS distribuée sur la page du firmware tiers Omega est sûrement suffisante pour nombre de choses, mais n'est pas stable.
Si tu es un utilisateur exigeant de KhiCAS, il te faut une version aussi fiable que possible et elle existe ; il te suffit de prendre l'application KhiCAS distribuée pour Delta, un autre firmware tiers.
Mise à part la gestion des applications, Delta apporte beaucoup moins d'améliorations qu'Omega, et malheureusement ces deux éditions de l'application KhiCAS ne sont pas interchangeables. En attendant une éventuelle résolution du problème, nous nous devons donc de tenir compte de Delta au classement.
D'autre part, nous ne l'avions pas remarqué mais Omega a changé la capacité du heap Python à compter de sa version 1.21 un peu plus tôt cette année...
Alors découvrons tout cela sans plus attendre.
Le module Python standard gc permet de connaître la capacité exacte du heap, d'un simple appel
Afin de pouvoir faire des comparaisons équitables, nous construisons notre propre script d'estimation de la capacité heap. Il utilise les tailles des objets Python suivantes, valides pour les plateformes 32 bits que sont à ce jour nos calculatrices :
Nous récupérerons de plus la plus grand taille d'objet que nous avons réussi à utiliser lors de ce test, on t'explique de suite.
Voici donc le script, issu du QCC 2020 :
Selon l'état de l'interpréteur Python, la capacité retournée par un appel
Sur les NumWorks munies du firmware officiel Epsilon nous trouvons 32,526 Ko, et c'était pareil avec le firmware tiers Omega jusqu'à la version 1.20.3.
Sur la NumWorks N0110 munie du firmware tiers Delta, nous trouvons nettement moins pour le heap de l'application Python officielle, seulement 24,179 Ko.
Est-ce cette économie de mémoire qui permet à KhiCAS de fonctionner correctement ? En tous cas l'interpréteur Python de KhiCAS retourne pour le même test la superbe capacité de 63,898 Ko.
gc.mem_alloc() + gc.mem_free()
. Toutefois, toutes les calculatrices Python n'intègrent pas ce module.Afin de pouvoir faire des comparaisons équitables, nous construisons notre propre script d'estimation de la capacité heap. Il utilise les tailles des objets Python suivantes, valides pour les plateformes 32 bits que sont à ce jour nos calculatrices :
- pour un entier nul : 24 octets déjà...
- pour un entier court non nul (codable sur 31 bits + 1 bit de signe) : 28 octets
- pour un entier long :
- 28 octets
- + 4 octets pour chaque groupe de 30 bits utilisé par son écriture binaire au-delà des 31 bits précédents
- pour une chaîne :
- 49 octets
- + 1 octet par caractère
- pour une liste :
- 64 octets
- + 8 octets par élément
- + les tailles de chaque élément
Nous récupérerons de plus la plus grand taille d'objet que nous avons réussi à utiliser lors de ce test, on t'explique de suite.
Voici donc le script, issu du QCC 2020 :
- Code: Select all
def size(o):
t = type(o)
s = t == str and 49 + len(o)
if t == int:
s = 24
while o:
s += 4
o >>= 30
elif t == list:
s = 64 + 8*len(o)
for so in o:
s += size(so)
return s
def mem(v=1):
try:
l=[]
try:
l.append(0)
l.append(0)
l.append("")
l[2] += "x"
l.append(0)
l.append(0)
while 1:
try:
l[2] += l[2][l[1]:]
except:
if l[1] < len(l[2]) - 1:
l[1] = len(l[2]) - 1
else:
raise(Exception)
except:
if v:
print("+", size(l))
try:
l[0] += size(l)
except:
pass
try:
l[3], l[4] = mem(v)
except:
pass
return l[0] + l[3], max(l[0], l[4])
except:
return 0, 0
Selon l'état de l'interpréteur Python, la capacité retournée par un appel
mem()
peut légèrement varier. Aussi lancerons-nous le test plusieurs fois et conserverons-nous la valeur maximale, voici une fonction en ce sens :- Code: Select all
def testmem():
m1, m2 = 0, 0
while 1:
t1, t2 = mem(0)
if t1 > m1 or t2 > m2:
m1 = max(t1, m1)
m2 = max(t2, m2)
input(str((m1,m2)))
Sur les NumWorks munies du firmware officiel Epsilon nous trouvons 32,526 Ko, et c'était pareil avec le firmware tiers Omega jusqu'à la version 1.20.3.
Sur la NumWorks N0110 munie du firmware tiers Delta, nous trouvons nettement moins pour le heap de l'application Python officielle, seulement 24,179 Ko.
Est-ce cette économie de mémoire qui permet à KhiCAS de fonctionner correctement ? En tous cas l'interpréteur Python de KhiCAS retourne pour le même test la superbe capacité de 63,898 Ko.
Si tu munis maintenant ta NumWorks des dernières version 1.21 du firmware tiers Omega, tu obtiens alors une fantastique capacité heap de désormais 98,928 Ko !
Avec la nouvelle capacité heap Python de près de 100 Ko dans Omega 1.21, ta NumWorks a enfin presque terminé de rattraper son retard sur la Casio Graph 35+E II bien moins chère !
Précisons que pour être aussi exact que possible, il faut rajouter à ces valeurs de retour la consommation mémoire des définitions du script, soit 1,056 Ko.
Avec la nouvelle capacité heap Python de près de 100 Ko dans Omega 1.21, ta NumWorks a enfin presque terminé de rattraper son retard sur la Casio Graph 35+E II bien moins chère !
Précisons que pour être aussi exact que possible, il faut rajouter à ces valeurs de retour la consommation mémoire des définitions du script, soit 1,056 Ko.
D'où le classement maintenant à jour :
À quand les 120K histoire que cela change l'ordre du classement ?
- 252,1 Mo : HP Prime G2
- 15,6 Mo : HP Prime G1
- 2,068 Mo : TI-Nspire CX II
- 1,033 Mo : Casio Graph 90+E
- 101,262 Ko : Casio Graph 35+E II
- 33,582 Ko : NumWorks
- 18,354 Ko : TI-83 Premium CE Edition Python
- 252,1 Mo : HP Prime G2
- 15,6 Mo : HP Prime G1
- 4,100 Mo : TI-Nspire CX (Ndless + KhiCAS)
- 2,068 Mo : TI-Nspire CX II
- 1,033 Mo : Casio Graph 90+E
- 101,262 Ko : Casio Graph 35+E II
- 98,928 Ko : NumWorks (firmware Omega)
- 64,954 Ko : NumWorks N0110 (firmware Delta / Omega + appli KhiCAS)
- 33,582 Ko : NumWorks
- 25,235 Ko : NumWorks N0110 (firmware Delta)
- 18,354 Ko : TI-83 Premium CE Edition Python
- 252,1 Mo : HP Prime G2
- 15,6 Mo : HP Prime G1
- 2,068 Mo : TI-Nspire CX II
- 1,033 Mo : Casio Graph 90+E / fx-CG50
- 101,262 Ko : Casio Graph 35+E II / fx-9750/9860GIII
- 33,582 Ko : NumWorks
- 20,839 Ko : TI-83 Premium CE + TI-Python
- 18,354 Ko : TI-83 Premium CE Edition Python / TI-84 Plus CE Python Edition
- 252,1 Mo : HP Prime G2
- 15,6 Mo : HP Prime G1
- 4,100 Mo : TI-Nspire CX / CX II (Ndless + KhiCAS CX / KhiCAS CX II)
- 2,068 Mo : TI-Nspire CX II
- 2,050 Mo : TI-Nspire (Ndless + MicroPython)
- 1,033 Mo : Casio Graph 90+E / fx-CG50
- 258,766 Ko : Casio Graph 35/75+E / 35/75/95 / fx-9750/9860GII (SH4 - appli CasioPython)
- 101,262 Ko : Casio Graph 35+E II / fx-9750/9860GIII
- 98,928 Ko : NumWorks (firmware Omega)
- 64,954 Ko : NumWorks N0110 (firmware Omega + appli KhiCAS)
- 33,582 Ko : NumWorks
- 32,648 Ko : Casio Graph 35+E II / 35/75/85/95(SH3) / fx-9750/9860GIII / fx-9750/9860GII(SH3) / fx-9860G (appli CasioPython)
- 25,235 Ko : NumWorks N0110 (firmware Delta)
- 23,685 Ko : TI-83 Premium CE + TI-Python (firmware tiers)
- 20,839 Ko : TI-83 Premium CE + TI-Python
- 18,354 Ko : TI-83 Premium CE Edition Python / TI-84 Plus CE Python Edition
À quand les 120K histoire que cela change l'ordre du classement ?