37 votes

Quelle peut être la taille de l'entrée de la fonction input() ?

Quelle taille peut avoir l'entrée que je fournis à la input() fonction ?

Malheureusement, il n'y avait pas de moyen facile de le tester. Après avoir utilisé beaucoup de copier-coller, je n'ai pas pu obtenir input pour échouer sur toutes les entrées que j'ai fournies. (et j'ai fini par abandonner)

El documentation pour le input La fonction ne mentionne rien à ce sujet :

Si le prompt est présent, il est écrit sur la sortie standard sans nouvelle ligne de fin. La fonction lit ensuite une ligne depuis l'entrée, la convertit en une chaîne de caractères (en supprimant la nouvelle ligne de fin), et la renvoie. Lorsque EOF est lu, EOFError est soulevée.

Donc, je suppose qu'il n'y a pas de limite ? Quelqu'un sait-il s'il y en a une et, si oui, à combien elle s'élève ?

34voto

Jim Points 8793

Bien sûr qu'il y en a, ça ne peut pas être illimité*. La phrase clé de la documentation qui, selon moi, doit être soulignée est la suivante :

[...] La fonction lit ensuite une ligne de l'entrée, le convertit en une chaîne de caractères (sans le saut de ligne de fin) [...]

(c'est moi qui souligne)

Puisqu'il convertit l'entrée que vous fournissez en une Python str l'objet se traduit essentiellement par : "Sa taille a doit être inférieure ou égale à la plus grande chaîne que Python peut créer".

La raison pour laquelle aucune taille explicite n'est donnée est probablement parce qu'il s'agit d'un détail d'implémentation. Imposer une taille maximale à toutes les autres implémentations de Python n'aurait pas beaucoup de sens.

*En CPython, au moins, la taille maximale d'une chaîne de caractères est limitée par la taille de sa chaîne de caractères. indice est autorisé à être (voir PEP 353 ). C'est-à-dire la taille du chiffre entre parenthèses. [] est autorisé à être lorsque vous essayez de l'indexer :

>>> s = ''
>>> s[2 ** 63]

IndexErrorTraceback (most recent call last)
<ipython-input-10-75e9ac36da20> in <module>()
----> 1 s[2 ** 63]

IndexError: cannot fit 'int' into an index-sized integer

(essayez le précédent avec <code>2 63 - 1</code> c'est la limite positive acceptable, <code>-2 63</code> est la limite négative).

Pour les indices, ce ne sont pas les nombres Python qui sont utilisés en interne, mais plutôt un Py_ssize_t qui est un int signé 32/64 bits sur des machines 32/64 bits respectivement. C'est donc la limite maximale, à ce qu'il semble.

(comme l'indique le message d'erreur, int et entier de taille intex sont deux choses différentes)

Il semble aussi que input() contrôles explicites si l'entrée fournie est plus grande que PY_SSIZE_T_MAX (la taille maximale de Py_ssize_t ) avant de procéder à la conversion :

if (len > PY_SSIZE_T_MAX) {
    PyErr_SetString(PyExc_OverflowError,
                    "input: input too long");
    result = NULL;
}

Ensuite, il convertit l'entrée en un langage Python str con PyUnicode_Decode .


Pour mettre cela en perspective, si un livre moyen est 500.000 et les estimation pour le nombre total de livres est d'environ 130 millions, vous pourriez théoriquement input autour :

>>> ((2 ** 63) - 1) // 500000 * 130000000
141898

fois ces caractères ; cela vous prendrait probablement un certain temps, cependant :-) (et vous seriez d'abord limité par la mémoire disponible !)

16voto

Alex Hall Points 20790

Nous pouvons trouver la réponse expérimentalement assez facilement. Créez deux fichiers :

make_lines.py :

num_lines = 34

if __name__ == '__main__':
    for i in range(num_lines):
        print('a' * (2 ** i))

read_input.py :

from make_lines import num_lines

for i in range(num_lines):
    print(len(input()))

Exécutez ensuite cette commande sous Linux ou OSX (je ne connais pas l'équivalent sous Windows) :

python make_lines.py | python3 read_input.py

Sur mon ordinateur, il parvient à terminer mais se débat à la fin, ralentissant considérablement les autres processus. La dernière chose qu'il imprime est 8589934592 c'est-à-dire 8 Go. Vous pouvez déterminer vous-même cette valeur en fonction de votre définition de ce qui est acceptable en termes de temps et de limites de mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X