Diciamo che voglio leggere una riga da una presa, utilizzando il modulo standard socket
:prese Python buffer
def read_line(s):
ret = ''
while True:
c = s.recv(1)
if c == '\n' or c == '':
break
else:
ret += c
return ret
Cosa succede esattamente in s.recv(1)
? Emetterà una chiamata di sistema ogni volta? Credo che dovrei aggiungere un po 'di buffering, in ogni caso:
Per una migliore corrispondenza con hardware e di rete realtà, il valore di bufsize dovrebbe essere una relativamente piccola potenza di 2, per esempio, 4096.
http://docs.python.org/library/socket.html#socket.socket.recv
Ma non sembra facile scrivere buffer efficiente e thread-safe. Cosa succede se uso file.readline()
?
# does this work well, is it efficiently buffered?
s.makefile().readline()
"Emetterà una chiamata di sistema ogni volta?" Perché questo importa? –
Perché le chiamate di sistema sono lente. È meglio recuperare una grande quantità di dati (se disponibile), quindi elaborarli. Ora so che Python non è particolarmente veloce, e forse questo non ha molta importanza. Ma la documentazione dice che è comunque meglio leggere da grandi pezzi. –
Nota che costruire una stringa usando '+ =' è un no-no dato che è potenzialmente quadratico, mentre la costruzione di un elenco usando append usando 'str.join' alla fine è sempre lineare. –