Donc pourquoi est-ce qu'au lieu de
float j'utilise une espèce de
mfloat bizarre qui en pratique est un sous-ensemble des rationnels, ceux de dénominateur 93 ?
Certainement pas pour vous embêter.
Nous avons donc 252 lampes et 30 potentiomètres, soit 282 états à stocker.
C'est... beaucoup. En tous cas pour certaines calculatrices.
Prenons un exemple :
- Code: Select all
from sys import *
>>> getsizeof(1<<0)
28
>>> getsizeof(1<<29)
28
>>> getsizeof(1<<30)
32
>>> getsizeof(1<<59)
32
>>> getsizeof(1<<60)
36
>>> getsizeof(1<<89)
36
>>> getsizeof(1<<90)
40
Comme vous le voyez, la taille d'un entier en Python progresse avec son nombre de bits.
Mais on peut empêcher cettre progression en faisant en sorte que les entiers utilisés ne dépassent jamais une certaine valeur.
Avec les floats, c'est différent. Il suffit parfois d'opérations enfantines pour les faire grossir :
- Code: Select all
>>> 1.2-.1
1.0999999999999999
Le facteur limitant est ici le lecteur en ligne NumWorks, avec ses 6K supposés de mémoire de travail.
Déjà, il se trouve qu'au départ ça ne rentrait même pas en mémoire. Sauf à réduire drastiquement le nombre de lampes ou de potentiomètres, et donc l'espace de recherche pour ceux qui voudraient tenter un bruteforce.
Mais supposons donc qu'à force de réduire ces 2 paramètres ça finisse enfin par rentrer, tout juste donc.
Toucher un potentiomètre implique de toucher à plein de floats dans les tableaux de lampes/potentiomètres. Et parmi ces nombreuses opérations, certaines vont faire grossir des floats dans le tableau, déclenchant ainsi un besoin de réallouer l'espace occupé.
C'est ce que nous avons eu, à peine 2-3 appels à
pot(k,v)
et ça explosait la mémoire de travail du lecteur en ligne NumWorks.
D'où l'idée de représenter les états des lampes et potentiomètres non plus par des flottants mais par des entiers, ici les numérateurs de fractions de dénominateur 93.