Page 1 of 2

QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 21:39
by critor
5409
Quelle Calculatrice programmable Choisir 2020
(index des épisodes)

Episode 3 - Python et pile (stack)

Dans l'épisode précédent nous avons donc vu quelles calculatrices étaient programmables en langage Python parmi celles conformes ou se prétendant conformes pour les examens 2021 et au-delà.

Les interpréteurs MicroPython ou similaires qu'elles font tourner font appel à 3 types de mémoires avec les rôles suivants :
  • la mémoire de stockage qui accueille et conserve tes scripts
  • le stack (pile) qui, à l'exécution, accueille les références vers les objets créés
  • le heap (tas) qui, à l'exécution, accueille le contenu de ces objets

En gros le stack limite donc le nombre d'objets différents pouvant exister simultanément en mémoire, alors que le heap limite la taille globale occupée par le contenu de ces objets.

Hors besoins très spécifiques ce n'est habituellement pas le facteur le plus limitant dans les projets pour qui sait optimiser son code, mais aujoud'hui nous allons commencer par nous intéresser au stack.



A ce jour nous ne savons pas mesurer exactement la capacité du stack. Mais par contre nous pouvons en déclencher une consommation massive, afin de pouvoir comparer et voir quels modèles s'en sortent le mieux.

Une situation très simple qui peut être grand consommatrice de stack c'est la récursivité, soit les fonctions qui se rappellent elles-mêmes. Notre protocole de test aujourd'hui va consister à lancer test(compte_r) à partir du script suivant :
Code: Select all
def compte_r(n):
  return n>0 and 1 + compte_r(n-1)

def test(f):
  n = 0
  try:
    while 1:
      n = f(n) + 1
  except Exception as e:
    print(e)
  return n

compte_r(n) est donc ici notre fonction récursive qui compte récursivement de 1 à n.

test(f) quant à elle va donc tester des appels f(n) avec n de plus en plus grand, jusqu'à déclenchement d'une erreur qui sera précisée.



Commençons donc avec les Casio Graph 35+E II et Graph 90+E et leur application Python officielle.

Le paramètre d'appel doit monter jusqu'à 82 pour permettre comme indiqué l'épuisement du stack.

Restons chez Casio mais cette fois-ci avec l'application tierce CasioPython. Elle est compatible avec différents modèles monochromes :

Sur les deux premiers nous obtenons une valeur limite extraordinaire de 5362.

Par contre un bug de CasioPython hélas toujours pas corrigé depuis l'année dernière lui fait prendre la Graph 35+E II pour un ancien modèle et réduire sa consommation mémoire, pour une valeur limite quand même relativement impressionnante de 655.

Il est à noter ici que le stack n'est a priori pas forcément épuisé, car la raison de l'erreur est différente. Ici c'est en effet la limite de récursivité configurée qui a été franchie.

Certes en Python on peut consulter cette limite via sys.getrecursionlimit() et même l'ajuster dynamiquement via sys.setrecursionlimit().

Mais ici l'application CasioPython utilise une implémentation MicroPython, ce qui fait que le module sys n'inclut pas ces accesseurs.

Passons maintenant aux TI-83 Premium CE Edition Python et TI-84 Plus CE-T Python Edition. Il y a visiblement du mieux par rapport à l'année dernière ! :D

Texas Instruments a en effet repoussé la limite de 23 à 28 via ses dernières mises à jour 5.5.1 et 5.5.5 ! :bj:

L'ancienne TI-83 Premium CE permet également la programmation Python si munies du module externe TI-Python, module interdit aux examens français mais parfaitement utilisable en classe ainsi qu'aux évaluations si l'enseignant le permet.

Le firmware TI-Python officiel nous permet ici d'aller jusqu'à 20 limite des niveaux de récursion et non du stack ici encore.

Le firmware tiers fourni par Lionel Debroux, bien que proposant nombre d'améliorations, a le défaut de baisser cette valeur limite à 15.

Ici il ne s'agit pas d'une implementation MicroPython mais propriétaire TI-Python, en réalité construite à partir de l'implémentation libre CircuitPython. En tous cas cela ne change rien, le module sys n'a pas ce qu'il faut pour nous permettre d'explorer plus loin via cette méthode.

1274012739Sur NumWorks ici aussi il y a eu du nouveau depuis l'année dernière, le constructeur ayant annoncé avoir quadruplé la taille du stack lors de la mise à jour intermédiaire 13.1.0. :)

Effectivement nous avons ici une progression formidable de la valeur limite, de 33 à 128 ! :bj:

Mais nous n'en avons pas encore terminé avec les NumWorks. Il est possible de leur installer très facilement un firmware tiers, Omega, qui leur rajoute plein de fonctionnalités y compris en mode examen ! :bj:

Sur la dernière édition matérielle NumWorks N0110, Omega permet notamment l'ajout d'applications. Plusieurs sont disponibles dont l'application de mathématiques intégrée KhiCAS par Bernard Parisse, enseignant chercheur à l'Université de Grenoble, une version adaptée aux plateformes nomades qui s'inspire de son propre logiciel de Mathématiques intégré Xcas, et en reprend notamment le moteur de calcul formel GIAC.

12741Et bien Bernard est justement en train de te préparer une mise à jour majeure de KhiCAS pour l'année scolaire 2020-2021, déjà accessible en version de test. Au menu des nouveautés une sous-application tableur / feuille de calculs, ainsi que l'intégration d'un véritable interpréteur MicroPython ! :bj:

Donc pour information, dans le mode interpréteur Python de KhiCAS, la limite est impactée mais très légèrement, passant à 126. Un bien maigre prix à payer par rapport à tous les avantages ! :D

Pour les TI-Nspire CX II, nous ne disposons hélas pas encore de préversion de la mise à jour qui devrait sortir mi-septembre 2020 et rajouter la programmation Python.

Pour les anciens modèles TI-Nspire CX et TI-Nspire monochromes par contre, si non encore mis à jour en version 4.5.1 ou supérieure, il est possible d'installer le jailbreak Ndless qui autorise à son tour par la suite l'installation d'applications tierces. :)
Attention toutefois, contrairement aux applications Omega pour NumWorks, les applications Ndless ont le gros défaut de ne pas rester disponibles en mode examen ! :mj:


Une fois Ndless installé, on peut par exemple rajouter l'application MicroPython, pour une limite ici de 130.

Mais pour les seules anciennes TI-Nspire CX, ce n'est pas tout. Bernard Parisse est également en train de préparer ici la même mise à jour majeure de l'application KhiCAS que pour NumWorks, avec feuille de calcul / tableur et véritable interpréteur MicroPython intégrés, également disponible en version de test ! :bj:

Ici la valeur limite monte même à 155 ! :)

Une mise à jour HP Prime rajoutant une application Python est dans les tuyaux. Aucune date de sortie connue à ce jour, mais une version intégrant cette fonctionnalité a été publiée par erreur en octobre 2019.
Cela a sûrement été corrigé depuis, mais cette vieille version est en pratique très instable, les fonctionnalités Python se payant bien cher... Nous te déconseillons fortement de l'installer dans le contexte d'évaluations.


Nous ne pourrons pas la classer en l'état, mais rien n'empêche d'en parler et de te donner un avant-goût de ce qui t'attend. ;)

Donc ici, la limite est de 77.




Résumé donc des capacités des différents modèles autour du stack Python, avec :
  • en haut les possibilités hors mode examen ou à venir dans de prochaines mises à jour lorsque connues (HP Prime, mais nous ignorons quand...)
  • en bas les capacités de la machine en mode examen sur les versions actuellement à notre disposition

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 22:22
by Afyu
C'est original, comme sujet d'article. J'aime bien ! :)

A ce jour nous ne savons pas mesurer exactement la capacité du stack.

Nous, qui ? Est-ce que tu veux dire "nous, utilisateur" ? Ou est-ce que c'est général ? Est-ce que tu veux dire qu'il n'existe aucune technique pour mesurer ça ?
Est-ce que l'équipe NumWorks connaît la taille du stack ?

Je trouve que le choix d'une échelle logarithmique pour la partie basse du graphique est peu adaptée ou peu pertinente. Elle masque un peu le grand écart entre le 28 et le 128 et comme il n'y a pas de grande valeur (contrairement à la partie haute du graphique) je trouve ce choix moins justifié que pour l'autre axe. Entre 28 et 128, est-ce que ça fait une grande différence, d'un point de vue programmation ?

Edit : en même temps, si tu choisis une échelle logarithmique pour la partie haute du graphique mais pas pour la partie basse, ça parait bizarre...

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 22:27
by critor
Je ne dis pas que c'est impossible, mais à ce jour je ne sais pas mesurer le stack en tant qu'utilisateur non, c'est-à-dire sans accès au code source.

Mais pourquoi pas un jour, j'en apprends tous les jours en Python, je creuse de plus en plus profond. ;)

Or, comme seul NumWorks donne l'accès au code source, ça ne permettra pas de comparer aux autres constructeurs.

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 22:33
by Afyu
D'accord. Alors un jour, peut-être... :)

Et quelle valeur trouve-t-on dans le code source d'Epsilon ?


Toujours concernant la NumWorks, tu parles de KhiCAS et de
l'intégration d'un véritable interpréteur Python !

Ça veut dire un interpréteur Python et pas MicroPython ?

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 22:35
by critor
C'est un interpréteur MicroPython, je vais préciser, merci.

C'est relatif au comportement actuel de KhiCAS, qui utilise une simple compatibilité syntaxique Python et non un véritable interpréteur.

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 22:39
by redgl0w
Le stack sur numworks a bien une valeure écrite dans le code : on peut la trouver sur ces lignes là https://github.com/numworks/epsilon/blob/edafa0e15555bdd024660e78e36756651bd85438/python/port/port.cpp#L120-L144.
N'ayant pas d'IDE sous la main (je suis sur mobile), je ne pourrais pas te dire quelle valeur (taille max du stack - taille utilisé du stack, ou 29000) est utilisé pour chaque platformes

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 22:46
by Afyu
Oh. D'accord. (la déception ^^)

Merci pour ce lien extrêmement précis, redgl0w :)
Si tu me dis comment faire, je veux bien regarder pour toi :)

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 22:53
by redgl0w
De ce que j'ai vu, le simu web utilise pystack, une alternative au heap, qui a moins besoin d'appeler souvent le garbage collector, qui visiblement cause des problèmes dans la version compilé avec emscripten.
Pour

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 22:55
by redgl0w
Donc de ce que j'ai vu, le simu web utilise pystack, qui permet de moins utiliser le heap, et d'appeller donc moins souvent le garbage collector, qui a l'air de parfois crash sur simu web.
Sinon, la limite semble clairement être à 29152 réccursion.
Edit : déso pour la duplication

Re: QCC 2020 épisode 3 : Python et pile (stack)

Unread postPosted: 07 Aug 2020, 23:01
by Afyu
D'accord. Comment fais-tu pour savoir que ce n'est pas le 1024 ?