Vous melangez.
J'e reconnais mon erreur, la première bibliothèque s'appelle en fait Numeric. Toutes mes excuses pour cette erreur.
Il n'y a pas de compression quand on utilise des booleens, c'est juste une utilisation optimale de l'espace disponible: sur un octet on peut mettre 8 booleens, chacun sur un bit.
La compression algorithme ne s'attache pas à un type primitif en particulier mais à tout le code généré à la compilation, dans le cas de numpy, la source est:
https://numpy.org/doc/stable/reference/simd/simd-optimizations.html sur un octet on peut mettre 8 booleens, chacun sur un bit
Un booleen n'est pas défini par un bit parce que cela impose d'avoir huit pointeurs sur un octet. Le premier problème avec un pointeur est de contenir une adresse mémoire (l'emplacement de l'octet) et non l'emplacement du bit dans l'octet, ce qui implique un second pointeur. Soit seize pointeurs sur un octet quand la moitié suffisent pour le type int (deux octets NDLR). Le second problème est que le microprocesseur doit amener le bit concerné à l'emplacement du bit 0 par décalage pour effectuer une comparaison logique avec la valeur 0 ou 1 en fonction du résultat recherché. Ce qui est une perte de temps.
Un autre problème que soulève ce fonctionnement est lié à la visibilité des données: quand le booléen n'est plus utilisé, il faut effacer les bits concernés dans les adresses mémoires avant d'effacer les pointeurs. Mais une telle opération ne peut être effectuée que manuellement, parce que aucun langage n'effectue d'opération bit à bit pour gérer un type de données primitif.
Je suis technicien en électronique de formation, avant d'avoir fait de l'informatique industrielle et je suis analyste-programmeur de métier. Je dirais que de ce point de vue je possède suffisamment d'expérience pour lire du code source et comprendre ce qui se passe dans l'ordinateur. Je ne remets pas en cause vos compétences mais je tiens surtout à remettre les bases de l'informatique à leur juste place.
Un compilateur fera tout pour ne pas avoir à recopier du code machine déjà écrit, c'est la version ultime de l'algorithme de Lemel-Ziv-Welch qui est à le principe de de tous les langages objets: réutiliser le code au maximum. Principe qui a été également repris par tous les systèmes d'exploitation. Le but étant toujours de ne pas recréer la roue à quelque niveau que ce soit...