Hãy nói rằng tôi muốn đọc một dòng từ một ổ cắm, sử dụng socket
mô-đun tiêu chuẩn:socket Python đệm
def read_line(s):
ret = ''
while True:
c = s.recv(1)
if c == '\n' or c == '':
break
else:
ret += c
return ret
gì chính xác xảy ra trong s.recv(1)
? Nó sẽ phát hành một cuộc gọi hệ thống mỗi lần? Tôi đoán tôi nên thêm một số đệm, dù sao:
Đối phù hợp nhất với phần cứng và mạng thực tế, giá trị của bufsize nên một sức mạnh tương đối nhỏ của 2, ví dụ, 4096.
http://docs.python.org/library/socket.html#socket.socket.recv
Nhưng dường như không dễ dàng để viết bộ đệm hiệu quả và an toàn theo chủ đề. Nếu tôi sử dụng file.readline()
thì sao?
# does this work well, is it efficiently buffered?
s.makefile().readline()
"Hệ thống có phát ra cuộc gọi hệ thống mỗi lần không?" Vì sao vấn đề này? –
Vì cuộc gọi hệ thống chậm. Tốt hơn là tìm nạp một lượng lớn dữ liệu (nếu có), sau đó xử lý nó. Bây giờ tôi biết rằng Python không phải là đặc biệt nhanh, và có lẽ điều này không thực sự quan trọng. Nhưng các tài liệu nói rằng nó tốt hơn để đọc bởi khối lớn anyway. –
Lưu ý rằng việc xây dựng một chuỗi bằng cách sử dụng '+ =' là một không-không vì nó có khả năng bậc hai, trong khi xây dựng một danh sách bằng cách nối thêm 'str.join' vào cuối luôn luôn là tuyến tính. –