Python buffer type มีไว้ทำอะไร?


138

มีbufferpython อยู่ประเภทหนึ่ง แต่ไม่รู้ว่าจะใช้งานได้อย่างไร

ในPython docคำอธิบายคือ:

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

อาร์กิวเมนต์อ็อบเจ็กต์ต้องเป็นอ็อบเจ็กต์ที่สนับสนุนอินเทอร์เฟซการเรียกบัฟเฟอร์ (เช่นสตริงอาร์เรย์และบัฟเฟอร์) จะมีการสร้างวัตถุบัฟเฟอร์ใหม่ซึ่งอ้างอิงอาร์กิวเมนต์ของวัตถุ วัตถุบัฟเฟอร์จะเป็นชิ้นส่วนจากจุดเริ่มต้นของวัตถุ (หรือจากค่าชดเชยที่ระบุ) ชิ้นส่วนจะขยายไปจนถึงจุดสิ้นสุดของวัตถุ (หรือจะมีความยาวตามอาร์กิวเมนต์ขนาด)

คำตอบ:


147

ตัวอย่างการใช้งาน:

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

บัฟเฟอร์ในกรณีนี้คือสตริงย่อยเริ่มต้นที่ตำแหน่ง 6 โดยมีความยาว 5 และไม่ใช้พื้นที่จัดเก็บเพิ่มเติม - อ้างอิงส่วนของสตริง

สิ่งนี้ไม่มีประโยชน์มากสำหรับสตริงสั้น ๆ เช่นนี้ แต่อาจจำเป็นเมื่อใช้ข้อมูลจำนวนมาก ตัวอย่างนี้ใช้ตัวแปร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'

สิ่งนี้จะมีประโยชน์มากหากคุณต้องการมีมุมมองข้อมูลมากกว่าหนึ่งมุมมองและไม่ต้องการ (หรือไม่สามารถ) เก็บสำเนาหลายชุดไว้ในหน่วยความจำ

โปรดทราบว่าbufferถูกแทนที่ด้วยชื่อที่ดีกว่าmemoryviewใน Python 3 แม้ว่าคุณจะสามารถใช้ได้ใน Python 2.7

โปรดทราบด้วยว่าคุณไม่สามารถใช้อินเทอร์เฟซบัฟเฟอร์สำหรับอ็อบเจ็กต์ของคุณเองได้โดยไม่ต้องเจาะลึก C API นั่นคือคุณไม่สามารถทำได้ใน Python ล้วนๆ


ขอบคุณสำหรับคำอธิบาย แต่ฉันยังไม่ค่อยเข้าใจความแตกต่างระหว่างการบัฟเฟอร์และการแบ่งส่วนแบบง่าย การใช้s[6:11]ไม่ใช้พื้นที่เก็บข้อมูลเพิ่มด้วยฉันคิดผิดหรือเปล่า?
satoru

10
โดยทั่วไปชิ้นส่วนจะใช้พื้นที่จัดเก็บเพิ่มเติมดังนั้นใช่s[6:11]จะเป็นสำเนา หากคุณตั้งค่าt = s[6:11]แล้วระบบdel sจะปลดปล่อยหน่วยความจำที่ถูกยึดโดยsพิสูจน์ว่าtถูกคัดลอก (หากต้องการดูสิ่งนี้คุณต้องมีขนาดใหญ่ขึ้นsและติดตามการใช้หน่วยความจำของ Python) อย่างไรก็ตามจะมีประสิทธิภาพมากกว่าในการทำสำเนาหากไม่มีข้อมูลเกี่ยวข้องมากนัก
Scott Griffiths

1
ขอบคุณมาก :) BTW คุณช่วยบอกฉันได้ไหมว่าฉันใช้เครื่องมืออะไรในการติดตามการใช้หน่วยความจำของ Python
satoru

สำหรับการใช้หน่วยความจำดูตัวอย่างเช่นstackoverflow.com/questions/110259 บางครั้งมันง่ายที่สุดแค่ดูการใช้งานของ Python ใน Task Manager / Activity Monitor / top
Scott Griffiths

13
สำหรับ Python noobs อย่างฉัน: บัฟเฟอร์คือ memoryview ใน Python 3
Dirk Bester

28

ฉันคิดว่าบัฟเฟอร์มีประโยชน์เช่นเมื่อเชื่อมต่อ python กับไลบรารีดั้งเดิม (Guido van Rossum อธิบายbufferไว้ในโพสต์รายชื่ออีเมลนี้ )

ตัวอย่างเช่น numpy ดูเหมือนจะใช้บัฟเฟอร์เพื่อการจัดเก็บข้อมูลที่มีประสิทธิภาพ:

import numpy
a = numpy.ndarray(1000000)

a.dataเป็น:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.