Saltar al contenido

sys.stdin.readline () y input (): ¿cuál es más rápido al leer líneas de entrada y por qué?

Solución:

El incorporado input y sys.stdin.readline las funciones no hacen exactamente lo mismo, y cuál es más rápida puede depender de los detalles de lo que estás haciendo exactamente. Como comentó aruisdante, la diferencia es menor en Python 3 que en Python 2, cuando la cita que proporcionaste era de, pero todavía hay algunas diferencias.

La primera diferencia es que input tiene un parámetro de solicitud opcional que se mostrará si el intérprete se ejecuta de forma interactiva. Esto genera algunos gastos generales, incluso si el indicador está vacío (el valor predeterminado). Por otro lado, puede ser más rápido que hacer un print antes de cada readline llame, si desea un aviso.

La siguiente diferencia es que input elimina cualquier nueva línea del final de la entrada. Si va a quitar eso de todos modos, puede ser más rápido dejarlo input hazlo por ti, en lugar de hacerlo sys.stdin.readline().strip().

Una última diferencia es cómo se indica el final de la entrada. input levantará un EOFError cuando lo llama si no hay más entrada (stdin se ha cerrado en el otro extremo). sys.stdin.readline por otro lado, devolverá una cadena vacía en EOF, que debe saber para verificar.

También hay una tercera opción, usando el protocolo de iteración de archivos en sys.stdin. Es probable que esto sea muy parecido a llamar readline, pero quizás una lógica más agradable.

Sospecho que si bien pueden existir diferencias en el rendimiento entre sus diversas opciones, es probable que sean más pequeñas que el costo de tiempo de simplemente leer el archivo del disco (si es grande) y hacer lo que sea que esté haciendo con él. Le sugiero que evite la trampa de la optimización prematura y haga lo que sea más natural para su problema, y ​​si el programa es demasiado lento (donde “demasiado lento” es muy subjetivo), haga algunos perfiles para ver qué está tomando más tiempo. No ponga mucho esfuerzo en decidir entre las diferentes formas de recibir aportes a menos que realmente importe.

Comprueba si es TTY cada vez que input () se ejecuta mediante syscall y funciona mucho más lento que sys.stdin.readline () https://github.com/python/cpython/blob/af2f5b1723b95e45e1f15b5bd52102b7de560f7c/Python/bltinmodule.c # L1981

Como dice Linn1024, para leer grandes cantidades de datos input() es mucho más lento. Un ejemplo simple es este:

import sys
for i in range(int(sys.argv[1])):
    sys.stdin.readline()

Esto toma alrededor de 0.25μs por iteración:

$ time yes | py readline.py 1000000
yes  0.05s user 0.00s system 22% cpu 0.252 total

Cambiando eso a sys.stdin.readline().strip() lleva eso a aproximadamente 0.31μs.

Cambiando readline() para input() es aproximadamente 10 veces más lento:

$ time yes | py input.py 1000000
yes  0.05s user 0.00s system 1% cpu 2.855 total

Sin embargo, tenga en cuenta que sigue siendo bastante rápido, por lo que solo debe preocuparse cuando lee miles de entradas como la anterior.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *