Digamos que quiero leer una línea desde un socket, utilizando el módulo estándar socket
:tomas Python búfer
def read_line(s):
ret = ''
while True:
c = s.recv(1)
if c == '\n' or c == '':
break
else:
ret += c
return ret
Lo que ocurre exactamente en s.recv(1)
? ¿Emitirá una llamada al sistema cada vez? Creo que debería añadir un poco de amortiguación, de todos modos:
Para obtener el mejor partido con las realidades de hardware y de red, el valor de bufsize debería ser una parte relativamente pequeña potencia de 2, por ejemplo, 4096.
http://docs.python.org/library/socket.html#socket.socket.recv
Pero no parece fácil escribir un búfer eficiente y seguro para subprocesos. ¿Qué pasa si uso file.readline()
?
# does this work well, is it efficiently buffered?
s.makefile().readline()
"¿Se emitirá una llamada al sistema cada vez?" ¿Por qué importa esto? –
Porque las llamadas al sistema son lentas. Es mejor buscar una gran cantidad de datos (si están disponibles) y luego procesarlos. Ahora sé que Python no es especialmente rápido, y tal vez esto realmente no importa. Pero la documentación dice que es mejor leer en trozos grandes de todos modos. –
Tenga en cuenta que la construcción de una cadena con '+ =' es un no-no, ya que es potencialmente cuadrática, mientras que la construcción de una lista usando anexar el uso de 'str.join' al final es siempre lineal. –