Mémoire tas/heap + tailles modules TI-83 Premium CE 5.5
Posted: 03 May 2020, 16:26
Dans sa prochaine mise à jour 5.5 gratuite prévue pour Mai 2020, Texas Instruments va rajouter de formidables possibilités à ta TI-83 Premium CE :
Cette dernière application apporte de nouveaux modules importables pour tes scripts Python :
- mise à jour en 5.5 de l'application SciTools
- mise à jour en 5.5 de l'application Periodic
- mise à jour en 5.5 de l'application Python (TI-83 Premium CE Édition Python uniquement)
Cette dernière application apporte de nouveaux modules importables pour tes scripts Python :
- time, certes déjà présent mais maintenant listé au menu et donc officiel; il ne risque plus de disparaitre
- ti_system, avec diverses possibilités :
- détection des simples pressions de touches clavier (sans validation donc) par l'utilisateur, avec même l'éventuel modificateur actif (
2nde
oualpha
), et ça marche aussi avec un clavier USB ! - affichage dans la console à la ligne que tu veux
- exportation de listes de nombres (entiers, flottants ou complexes) existant dans le contexte Python vers l'environnement de la calculatrice, pour traitement à l'aide d'autres applications
- importation depuis le contexte Python de listes ou équation de régression existant dans l'environnement de la calculatrice
- et donc plus généralement un début d'intégration du Python à l'environnement mathématique de la calculatrice, enfin l'application Python va pouvoir servir non plus seulement à coder un truc déconnecté dans un coin, mais à traiter des problèmes et tâches complexes dans leur globalité !
- détection des simples pressions de touches clavier (sans validation donc) par l'utilisateur, avec même l'éventuel modificateur actif (
- ti_plotlib, une bibliothèque graphique pour tracer dans un repère, conformément aux programmes de Physique-Chimie, SNT et NSI, tout en permettant également nombre d'applications en Mathématiques !
- ti_hub, pour les projets d'objects connectés à l'aide de l'interface TI-Innovator Hub
- ti_rover, pour les projets de robotique à l'aide du TI-Innovator Rover
- ainsi qu'un mystérieux ti_graphics pour sa part non listé au menu, mais justement utilisé par ti_plotlib
Avant de poursuivre notre exploration des modules, voyons un petit peu où nous en sommes aujourd'hui niveau mémoire.
Attention, nous ne disposons que d'une préversion. Il est donc parfaitement possible que plusieurs points abordés dans notre critique soient améliorés d'ici la sortie.
Les interpréteurs MicroPython ou similaires qui tournent sur ta calculatrice font appel à 3 types de mémoires avec les rôles suivants :
A moins d'avoir de gros besoins en terme de récursivité, le facteur limitant pour tes projets Python sur calculatrice est habituellement le heap / tas.
- la mémoire de stockage qui accueille et conserve tes scripts Python
- le stack (pile) qui, à l'exécution, accueille les références vers les objets Python créés
- le heap (tas) qui, à l'exécution, accueille les valeurs de ces objets Python
A moins d'avoir de gros besoins en terme de récursivité, le facteur limitant pour tes projets Python sur calculatrice est habituellement le heap / tas.
Sommaire :
1) mémoire de tas / heap et module gc
Go to topL'appel mem() avec le script mem.py suivant permet d'estimer la capacité du tas (heap) Python, et retournait jusqu'à présent près de 20K sur TI-83 Premium CE Édition Python :
Les formidables nouveautés de la version 5.5 semblent hélas avoir un coût important, à vide nous trouvons désormais à peine 17,5K de libres avec la version 5.5, un effondrement non négligeable de plus de 2,5K.
La TI-83 Premium CE Édition Python fait partie des très rares calculatrices disposant du module gc, module qui va nous être bien pratique pour comprendre ce qui se passe. Retenons les appels suivants :
Testons à vide à l'aide du petit script suivant :
Nous découvrons donc que le tas Python de la TI-83 Premium CE Édition Python fait exactement 19,968K; sa capacité totale n'a donc pas été réduite.
Mais, lorsque tu lances tes scripts Python plusieurs choses sont initialisées et consomment du tas avant même l'exécution de ta première ligne de code. Et c'est là qu'il y a une lourde différence :
En passant il est normal que l'on trouve ici à chaque fois un petit peu moins que l'espace libre trouvé avec mem(), puisqu'il y a ici l'importation obligatoire du module gc qui consomme également du tas.
D'où le classement en terme de capacité tas (heap) disponible pour tes scripts, avec la capacité totale précisée lorsque le module gc est disponible :
- Code: Select all
def sizeenv():
s=0
import __main__
for o in dir(__main__):
try:s+=size(eval(o))
except:pass
return s
def size(o):
s,t=0,type(o)
if t==str:s=49+len(o)
if str(t)=="<class 'function'>":s=136
if t==int:
s=24
while o:
s+=4
o>>=30
if t==list:
s+=64
for so in o:s+=8+size(so)
return s
def mem(v=1,r=1):
try:
l=[]
try:
l+=[r and 793+sizeenv()]
if v*r:print(" ",l[0])
l+=[0]
l+=[""]
l[2]+="x"
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[0]+=mem(v,0)
except:pass
return l[0]
except:return 0
Les formidables nouveautés de la version 5.5 semblent hélas avoir un coût important, à vide nous trouvons désormais à peine 17,5K de libres avec la version 5.5, un effondrement non négligeable de plus de 2,5K.
La TI-83 Premium CE Édition Python fait partie des très rares calculatrices disposant du module gc, module qui va nous être bien pratique pour comprendre ce qui se passe. Retenons les appels suivants :
gc.mem_alloc()
retourne l'espace occupé sur le tas (heap)gc.mem_free()
retourne l'espace libre sur le tas (heap)
Testons à vide à l'aide du petit script suivant :
- Code: Select all
from gc import *
a, f = mem_alloc(), mem_free()
(a, f, a+f)
Nous découvrons donc que le tas Python de la TI-83 Premium CE Édition Python fait exactement 19,968K; sa capacité totale n'a donc pas été réduite.
Mais, lorsque tu lances tes scripts Python plusieurs choses sont initialisées et consomment du tas avant même l'exécution de ta première ligne de code. Et c'est là qu'il y a une lourde différence :
- avec la dernière version 5.4 : juste 608o consommés pour pas moins de 19,36Ko de libres
- avec la prochaine version 5.5 : pas moins de 2912o consommés pour juste 17,056Ko de libres
En passant il est normal que l'on trouve ici à chaque fois un petit peu moins que l'espace libre trouvé avec mem(), puisqu'il y a ici l'importation obligatoire du module gc qui consomme également du tas.
D'où le classement en terme de capacité tas (heap) disponible pour tes scripts, avec la capacité totale précisée lorsque le module gc est disponible :
- 1,032942 Mo : Casio Graph 90+E
- 1,022145 / 1,024512 Mo : HP Prime G1 (version alpha)
- 100,560 Ko : Casio Graph 35+E II
- 32,339 Ko : NumWorks (firmware Omega)
- 31,624 Ko : NumWorks
19,500 / 19,968 Ko : TI-83 Premium CE Édition Python(ancienne version)- 17,359 / 19,968 Ko : TI-83 Premium CE Édition Python (nouvelle version)
- 2,049276 Mo : TI-Nspire (application MicroPython)
- 1,032942 Mo : Casio Graph 90+E / fx-CG50
- 1,022145 Mo : HP Prime G1 (version alpha)
- 257,636 / 258,048 Ko : Casio Graph 35+E / 75+ / 35+ USB Power Graphic 2 / 75/95 USB Power Graphic 2 / fx-9750/9860GII USB Power Graphic 2
- 100,560 Ko : Casio Graph 35+E II / fx-9750/9860GIII
- 32,339 Ko : NumWorks (firmware Omega)
- 31,624 Ko : NumWorks
- 31,520 / 32,256 Ko : Casio Graph 35+E II / 85 / 35+ USB Power Graphic 1 / 75/95 USB Power Graphic 1 / fx-9750/9860GIII / fx-9750/9860GII USB Power Graphic 1 / fx-9860G
- 22,605 / 22,912 Ko : TI-83 Premium CE + TI-Python (firmware tiers)
- 19,500 / 19,968 Ko : TI-83 Premium CE + TI-Python +
TI-83 Premium CE Édition Python(ancienne version) - 17,359 / 19,968 Ko : TI-83 Premium CE Édition Python (nouvelle version)
La TI-83 Premium CE Édition Python était déjà la pire solution Python pour la capacité tas, et cela ne fait donc qu'empirer.
C'est probablement largement suffisant pour les petits algo-musements de quelques lignes qui seront traités en Mathématiques ou Physique-Chimie.
Le problème est ailleurs, ceux qui auront suffisamment accroché pour avoir envie d'aller plus loin risquent d'être rapidement déçus par leur calculatrice...
Ceux qui aborderont des projets (SNT, NSI, ... ou même non scolaires) risquent d'obtenir des erreurs de mémoire assez rapidement après le début du projet...
Car le Python ce n'est pas du C, les objets Python les plus élémentaires sont extrêmement gourmands en mémoire :
Quand on pense à tout ce que nous avons pu souffrir sur NumWorks depuis la rentrée 2017 avec seulement 16K de tas disponible avant la mise à jour 13.2 faisant passer cela à 32K, nous sommes en effet assez pessimistes ici devant nos même pas 17.5K de tas.
Il est possible que l'on ne puisse pas importer simultanément l'ensemble des modules.
Il risque de ne pas rester beaucoup de tas disponible pour coder une fois certains gros modules importés, et nous allons revenir là-dessus.
Cela remet au passage en question notre projet déjà évoqué de développer certains scripts de compatibilité, scripts qui ne feraient alors que réduire encore davantage le peu de mémoire tas utilisable pour tes scripts si tu dois les importer en plus des modules en question.
Les erreurs de mémoire risquent donc d'arriver très rapidement. A cause de ce gros défaut, les scripts Python offerts en ligne risquent à notre avis d'être à terme plus nombreux et surtout beaucoup plus conséquents pour les solutions concurrentes que pour la TI-83 Premium CE Édition Python, et ce malgré toutes ses formidables possibilités.
Le pire était que cela fait plus de 2 ans que nous communiquons régulièrement (sans aucune malveillance) sur ce grave défaut aujourd'hui corrigé de la NumWorks, et comprenons donc assez mal que la même erreur ait pu être reproduite ici.
A moins que ce ne soit en fait exprès pour pousser ceux qui veulent aller plus loin à un investissement dans les modèles haut de gamme TI-Nspire CX II ?...
C'est probablement largement suffisant pour les petits algo-musements de quelques lignes qui seront traités en Mathématiques ou Physique-Chimie.
Le problème est ailleurs, ceux qui auront suffisamment accroché pour avoir envie d'aller plus loin risquent d'être rapidement déçus par leur calculatrice...
Ceux qui aborderont des projets (SNT, NSI, ... ou même non scolaires) risquent d'obtenir des erreurs de mémoire assez rapidement après le début du projet...
Car le Python ce n'est pas du C, les objets Python les plus élémentaires sont extrêmement gourmands en mémoire :
- 64 octets rien que pour une liste vide
- plus 8 octets pour chaque élément de liste supplémentaire, sans compter la taille de l'élément en question
- 24 octets pour un entier nul
- 28 octets pour un entier court non nul
- 49 octets rien que pour une chaîne vide
- plus 1 octet par caractère de chaîne supplémentaire
- ...
Quand on pense à tout ce que nous avons pu souffrir sur NumWorks depuis la rentrée 2017 avec seulement 16K de tas disponible avant la mise à jour 13.2 faisant passer cela à 32K, nous sommes en effet assez pessimistes ici devant nos même pas 17.5K de tas.
Il est possible que l'on ne puisse pas importer simultanément l'ensemble des modules.
Il risque de ne pas rester beaucoup de tas disponible pour coder une fois certains gros modules importés, et nous allons revenir là-dessus.
Cela remet au passage en question notre projet déjà évoqué de développer certains scripts de compatibilité, scripts qui ne feraient alors que réduire encore davantage le peu de mémoire tas utilisable pour tes scripts si tu dois les importer en plus des modules en question.
Les erreurs de mémoire risquent donc d'arriver très rapidement. A cause de ce gros défaut, les scripts Python offerts en ligne risquent à notre avis d'être à terme plus nombreux et surtout beaucoup plus conséquents pour les solutions concurrentes que pour la TI-83 Premium CE Édition Python, et ce malgré toutes ses formidables possibilités.
Le pire était que cela fait plus de 2 ans que nous communiquons régulièrement (sans aucune malveillance) sur ce grave défaut aujourd'hui corrigé de la NumWorks, et comprenons donc assez mal que la même erreur ait pu être reproduite ici.
A moins que ce ne soit en fait exprès pour pousser ceux qui veulent aller plus loin à un investissement dans les modèles haut de gamme TI-Nspire CX II ?...
2) types de scripts et scripts préremplis
Go to topGrande nouveauté de l'application Python 5.5, le menu de création de scripts te permet d'en choisir un type avec la touche
Outre le type Script vierge par défaut, tu obtiens alors un script prérempli à compléter :
Une belle initiative, voilà de quoi bien alléger tes saisies clavier lorsque tu commences un nouveau script !
F3.
Outre le type Script vierge par défaut, tu obtiens alors un script prérempli à compléter :
- Calculs Mathématiques : importe math
- Simulation Aléatoire : importe random
- Tracer (x,y) et Texte : importe ti_plotlib + script de tracé de nuage de points avec les listes x et y à remplir
- Partage de Données : importe ti_system
- Projets STEM Hub : importe ti_system et time
- Rover : importe time, ti_system et ti_rover
Une belle initiative, voilà de quoi bien alléger tes saisies clavier lorsque tu commences un nouveau script !
3) importations modules et consommation tas / heap
Go to topVoyons enfin un petit peu ce que consomme l'importation de chaque module disponible sur le tas (heap).
Il suffit d'appeler les fonctions du module gc vues plus haut, juste avant et après l'importation d'un module.
Voici un script en ce sens, volontairement minimaliste sans définition de fonction afin de minimiser les chances de déclencher en cours d'exécution un nettoyage mémoire qui fausserait les résultats :
Voici donc les consommations de tas à l'importation des différents modules intégrés :
Nos craintes évoquées plus haut étaient donc apparemment bien fondées; plusieurs modules sont très gros avec plusieurs kilooctets consommés sur le tas: ti_graphics, ti_rover et ti_plotlib notamment, avec quasiment la moitié du tas initialement disponible pour ce dernier.
Quand tu vas donc coder tes scripts et surtout projets Python sur TI-83 Premium CE Édition Python, contrairement à ce que tu fais peut-être sur d'autres plateformes n'importe que le strict nécessaire.
Aussi si ton projet nécessite des affichages graphiques (interfaces de menus, jeux, ...), évite à tous prix le module ti_plotlib sauf si tu as vraiment besoin de tracer des diagrammes (nuages de points, histogrammes...). Préfère-lui plutôt le module ti_graphics beaucoup plus économe.
Plutôt que d'utiliser les coordonnées dans un repère orthogonal, ti_graphics te fera travailler en terme de pixels ce qui sera beaucoup plus précis; et nous allons t'en présenter les formidables possibilités très prochainement.
Alors justement, à très bientôt
Il suffit d'appeler les fonctions du module gc vues plus haut, juste avant et après l'importation d'un module.
Voici un script en ce sens, volontairement minimaliste sans définition de fonction afin de minimiser les chances de déclencher en cours d'exécution un nettoyage mémoire qui fausserait les résultats :
- Code: Select all
from gc import mem_free as mf
smod = input('Module : ')
mf1, mf2 = 0, 0
scmd = 'from ' + s + ' import *'
mf1 = mf()
exec(scmd)
mf2 = mf()
print(mf1 - mf2)
Voici donc les consommations de tas à l'importation des différents modules intégrés :
- array : 96 o
- builtins : 816 o
- collections : 96 o
- gc : 128 o
- math : 336 o
- random : 176 o
- sys : 224 o
- ti_graphics : 2,896 Ko
- ti_hub : 224 o
- ti_plotlib : 7,232 Ko
- ti_rover : 4,848 Ko
- ti_system : 176 o
- time : 112 o
Nos craintes évoquées plus haut étaient donc apparemment bien fondées; plusieurs modules sont très gros avec plusieurs kilooctets consommés sur le tas: ti_graphics, ti_rover et ti_plotlib notamment, avec quasiment la moitié du tas initialement disponible pour ce dernier.
Quand tu vas donc coder tes scripts et surtout projets Python sur TI-83 Premium CE Édition Python, contrairement à ce que tu fais peut-être sur d'autres plateformes n'importe que le strict nécessaire.
Aussi si ton projet nécessite des affichages graphiques (interfaces de menus, jeux, ...), évite à tous prix le module ti_plotlib sauf si tu as vraiment besoin de tracer des diagrammes (nuages de points, histogrammes...). Préfère-lui plutôt le module ti_graphics beaucoup plus économe.
Plutôt que d'utiliser les coordonnées dans un repère orthogonal, ti_graphics te fera travailler en terme de pixels ce qui sera beaucoup plus précis; et nous allons t'en présenter les formidables possibilités très prochainement.
Alors justement, à très bientôt
Conclusion
Go to topNous t'avions dit en introduction que les éventuels points négatifs pourraient très bien être améliorés d'ici la sortie, vu que nous ne disposons que d'une préversion.
Toutefois, dans le cas particulier du tas (heap) Python traité aujourd'hui nous sommes assez pessimistes.
Rappelons en effet un petit peu l'architecture matérielle assez particulière de la TI-83 Premium CE Édition Python :
NumWorks a mis deux ans et demi à le comprendre; si tant est que Texas Instruments comprenne également en quoi 17.5K de tas sont un inconvénient majeur même dans un contexte scolaire, nous craignons que les améliorations ne puissent concerner qu'une future révision matérielle ou même un futur modèle, sans doute encore lointain pour le milieu de gamme vu que la TI-83 Premium CE Édition Python a tout juste 1 an.
Toutefois, dans le cas particulier du tas (heap) Python traité aujourd'hui nous sommes assez pessimistes.
Rappelons en effet un petit peu l'architecture matérielle assez particulière de la TI-83 Premium CE Édition Python :
- un cœur secondaire 32 bits Atmel SAMD21E18A-U dédié à l'exécution des scripts Python
- un cœur principal eZ80 qui est le seul à avoir accès à l'ensemble des autres composantes (Flash, contrôleur écran, cœur secondaire...)
- un processeur 32 bits ARM Cortex-M0+ cadencé à 48 MHz et agissant donc ici en tant que coprocesseur pour l'exécution de tes scripts Python
- une mémoire Flash de 256 Kio
- une mémoire SRAM de 32 Kio
- certes le tas (heap) Python de près de 20K mais pas que
- également la pile (stack) Python
- et aussi il ne faut pas l'oublier l'exécution du firmware CircuitPython modifié inclus dans la mémoire Flash et qui fournit l'interpréteur Python
NumWorks a mis deux ans et demi à le comprendre; si tant est que Texas Instruments comprenne également en quoi 17.5K de tas sont un inconvénient majeur même dans un contexte scolaire, nous craignons que les améliorations ne puissent concerner qu'une future révision matérielle ou même un futur modèle, sans doute encore lointain pour le milieu de gamme vu que la TI-83 Premium CE Édition Python a tout juste 1 an.