Kiểm tra tài liệu trên memoryview:
các đối tượng memoryview cho phép mã Python truy cập dữ liệu bên trong của một đối tượng hỗ trợ giao thức đệm mà không cần sao chép.
class memoryview (obj)
Tạo một chế độ xem bộ nhớ tham chiếu tới đối tượng. obj phải hỗ trợ giao thức đệm. Các đối tượng tích hợp hỗ trợ giao thức đệm bao gồm byte và bytearray.
Sau đó, chúng tôi được cung cấp mã mẫu:
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
Báo giá đã qua, bây giờ chúng ta hãy xem xét kỹ hơn:
>>> b = b'long bytes stream'
>>> b.startswith(b'long')
True
>>> v = memoryview(b)
>>> vsub = v[5:]
>>> vsub.startswith(b'bytes')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'memoryview' object has no attribute 'startswith'
>>> bytes(vsub).startswith(b'bytes')
True
>>>
Vì vậy, những gì tôi thu thập được từ những điều trên:
Chúng ta tạo một đối tượng memoryview để hiển thị dữ liệu bên trong của đối tượng đệm mà không cần sao chép, tuy nhiên, để làm bất cứ điều gì hữu ích với đối tượng (bằng cách gọi các phương thức được cung cấp bởi đối tượng), chúng ta phải tạo một bản sao!
Thông thường memoryview (hoặc đối tượng đệm cũ) sẽ cần thiết khi chúng ta có một đối tượng lớn và các lát cắt cũng có thể lớn. Nhu cầu về hiệu quả tốt hơn sẽ xuất hiện nếu chúng ta đang làm các lát lớn, hoặc làm các lát nhỏ nhưng với số lượng lớn.
Với sơ đồ trên, tôi không thấy nó có thể hữu ích như thế nào cho cả hai trường hợp, trừ khi ai đó có thể giải thích cho tôi những gì tôi đang thiếu ở đây.
Chỉnh sửa1:
Chúng tôi có một lượng lớn dữ liệu, chúng tôi muốn xử lý nó bằng cách tiến qua nó từ đầu đến cuối, ví dụ như trích xuất mã thông báo từ đầu chuỗi đệm cho đến khi bộ đệm được sử dụng. Trong thuật ngữ C, điều này là tiến một con trỏ qua bộ đệm và con trỏ có thể được chuyển đến bất kỳ hàm nào mong đợi loại bộ đệm. Làm thế nào một cái gì đó tương tự có thể được thực hiện trong python?
Mọi người đề xuất các giải pháp thay thế, ví dụ như nhiều hàm chuỗi và hàm regex lấy các đối số vị trí có thể được sử dụng để mô phỏng việc tăng tiến một con trỏ. Có hai vấn đề với điều này: đầu tiên đó là một công việc xung quanh, bạn buộc phải thay đổi phong cách mã hóa của mình để khắc phục những thiếu sót và thứ hai: không phải tất cả các hàm đều có đối số vị trí, ví dụ như hàm regex và startswith
hãy làm, encode()
/ decode()
không.
Những người khác có thể đề xuất tải dữ liệu theo từng phần hoặc xử lý bộ đệm trong các phân đoạn nhỏ lớn hơn mã thông báo tối đa. Được rồi, vì vậy chúng tôi đã biết về những cách giải quyết có thể có này, nhưng chúng tôi phải làm việc theo cách tự nhiên hơn trong python mà không cố gắng uốn cong phong cách mã hóa để phù hợp với ngôn ngữ - phải không?
Chỉnh sửa2:
Một mẫu mã sẽ làm cho mọi thứ rõ ràng hơn. Đây là những gì tôi muốn làm và những gì tôi cho rằng chế độ xem bộ nhớ sẽ cho phép tôi làm ngay từ cái nhìn đầu tiên. Hãy sử dụng pmview (chế độ xem bộ nhớ thích hợp) cho chức năng tôi đang tìm kiếm:
tokens = []
xlarge_str = get_string()
xlarge_str_view = pmview(xlarge_str)
while True:
token = get_token(xlarge_str_view)
if token:
xlarge_str_view = xlarge_str_view.vslice(len(token))
# vslice: view slice: default stop paramter at end of buffer
tokens.append(token)
else:
break