Loại bộ đệm Python để làm gì?


136

Có một bufferloại trăn, nhưng tôi không biết làm thế nào tôi có thể sử dụng nó.

Trong tài liệu Python , mô tả là:

buffer(object[, offset[, size]])

Đối số đối tượng phải là một đối tượng hỗ trợ giao diện gọi bộ đệm (chẳng hạn như chuỗi, mảng và bộ đệm). Một đối tượng bộ đệm mới sẽ được tạo để tham chiếu đối số đối tượng. Đối tượng đệm sẽ là một lát cắt từ đầu đối tượng (hoặc từ phần bù được chỉ định). Lát sẽ mở rộng đến cuối đối tượng (hoặc sẽ có độ dài được cho bởi đối số kích thước).

Câu trả lời:


145

Một ví dụ sử dụng:

>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world

Bộ đệm trong trường hợp này là một chuỗi con, bắt đầu từ vị trí 6 với độ dài 5 và nó không chiếm thêm dung lượng lưu trữ - nó tham chiếu một lát của chuỗi.

Điều này không hữu ích cho các chuỗi ngắn như thế này, nhưng nó có thể cần thiết khi sử dụng lượng lớn dữ liệu. Ví dụ này sử dụng một biến đổi bytearray:

>>> s = bytearray(1000000)   # a million zeroed bytes
>>> t = buffer(s, 1)         # slice cuts off the first byte
>>> s[1] = 5                 # set the second element in s
>>> t[0]                     # which is now also the first element in t!
'\x05'

Điều này có thể rất hữu ích nếu bạn muốn có nhiều hơn một lượt xem trên dữ liệu và không muốn (hoặc không thể) giữ nhiều bản sao trong bộ nhớ.

Lưu ý rằng bufferđã được thay thế bằng tên tốt hơn memoryviewtrong Python 3, mặc dù bạn có thể sử dụng trong Python 2.7.

Cũng lưu ý rằng bạn không thể triển khai giao diện bộ đệm cho các đối tượng của riêng mình mà không đào sâu vào API C, tức là bạn không thể làm điều đó bằng Python thuần túy.


Cảm ơn lời giải thích của bạn. Nhưng tôi vẫn không hiểu sự khác biệt giữa bộ đệm và cắt lát đơn giản. Việc sử dụng s[6:11]không chiếm thêm dung lượng lưu trữ, tôi có sai không?
satoru

9
Nói chung, một lát sẽ có thêm dung lượng lưu trữ, vì vậy có s[6:11]sẽ là một bản sao. Nếu bạn thiết lập t = s[6:11]và sau đó del s, nó sẽ giải phóng bộ nhớ đã được sử dụng s, chứng minh rằng nó tđã được sao chép. (Để thấy điều này, bạn cần ssử dụng bộ nhớ của Python lớn hơn và theo dõi). Tuy nhiên, sẽ hiệu quả hơn nhiều nếu chỉ tạo bản sao nếu không có nhiều dữ liệu liên quan.
Scott Griffiths

1
Cảm ơn bạn rất nhiều :) BTW, bạn có thể vui lòng cho tôi biết tôi có thể sử dụng công cụ nào để theo dõi việc sử dụng bộ nhớ của Python không?
satoru

Để sử dụng bộ nhớ, hãy xem stackoverflow.com/questions/110259 chẳng hạn. Đôi khi, dễ nhất chỉ để xem việc sử dụng Python trong Trình quản lý tác vụ / Trình giám sát hoạt động / đầu trang.
Scott Griffiths

13
Đối với những người dùng Python như tôi: bộ đệm là memoryview trong Python 3
Dirk Bester

25

Tôi nghĩ rằng bộ đệm rất hữu ích khi kết nối python với các thư viện riêng. (Guido van Rossum giải thích buffertrong bài đăng danh sách gửi thư này ).

Ví dụ, numpy dường như sử dụng bộ đệm để lưu trữ dữ liệu hiệu quả:

import numpy
a = numpy.ndarray(1000000)

đó a.datalà một

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.