欢迎光临
我们一直在努力

Python memoryview 深度解析

1. 什么是 memoryview?

memoryview 是 Python 内置的一个对象,它允许你在不复制数据的情况下,直接访问支持缓冲区协议(Buffer Protocol)的对象的内部内存。

核心一句话:memoryview 是原始数据的“零拷贝视图”或“窗口”。

️ 架构图:内存模型对比

#mermaid-svg-NfUHL4osRtnoDNrJ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NfUHL4osRtnoDNrJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NfUHL4osRtnoDNrJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NfUHL4osRtnoDNrJ .error-icon{fill:#552222;}#mermaid-svg-NfUHL4osRtnoDNrJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NfUHL4osRtnoDNrJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NfUHL4osRtnoDNrJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NfUHL4osRtnoDNrJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NfUHL4osRtnoDNrJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NfUHL4osRtnoDNrJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NfUHL4osRtnoDNrJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NfUHL4osRtnoDNrJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NfUHL4osRtnoDNrJ .marker.cross{stroke:#333333;}#mermaid-svg-NfUHL4osRtnoDNrJ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NfUHL4osRtnoDNrJ p{margin:0;}#mermaid-svg-NfUHL4osRtnoDNrJ .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-NfUHL4osRtnoDNrJ .cluster-label text{fill:#333;}#mermaid-svg-NfUHL4osRtnoDNrJ .cluster-label span{color:#333;}#mermaid-svg-NfUHL4osRtnoDNrJ .cluster-label span p{background-color:transparent;}#mermaid-svg-NfUHL4osRtnoDNrJ .label text,#mermaid-svg-NfUHL4osRtnoDNrJ span{fill:#333;color:#333;}#mermaid-svg-NfUHL4osRtnoDNrJ .node rect,#mermaid-svg-NfUHL4osRtnoDNrJ .node circle,#mermaid-svg-NfUHL4osRtnoDNrJ .node ellipse,#mermaid-svg-NfUHL4osRtnoDNrJ .node polygon,#mermaid-svg-NfUHL4osRtnoDNrJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NfUHL4osRtnoDNrJ .rough-node .label text,#mermaid-svg-NfUHL4osRtnoDNrJ .node .label text,#mermaid-svg-NfUHL4osRtnoDNrJ .image-shape .label,#mermaid-svg-NfUHL4osRtnoDNrJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-NfUHL4osRtnoDNrJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NfUHL4osRtnoDNrJ .rough-node .label,#mermaid-svg-NfUHL4osRtnoDNrJ .node .label,#mermaid-svg-NfUHL4osRtnoDNrJ .image-shape .label,#mermaid-svg-NfUHL4osRtnoDNrJ .icon-shape .label{text-align:center;}#mermaid-svg-NfUHL4osRtnoDNrJ .node.clickable{cursor:pointer;}#mermaid-svg-NfUHL4osRtnoDNrJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NfUHL4osRtnoDNrJ .arrowheadPath{fill:#333333;}#mermaid-svg-NfUHL4osRtnoDNrJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NfUHL4osRtnoDNrJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NfUHL4osRtnoDNrJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NfUHL4osRtnoDNrJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NfUHL4osRtnoDNrJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NfUHL4osRtnoDNrJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NfUHL4osRtnoDNrJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NfUHL4osRtnoDNrJ .cluster text{fill:#333;}#mermaid-svg-NfUHL4osRtnoDNrJ .cluster span{color:#333;}#mermaid-svg-NfUHL4osRtnoDNrJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NfUHL4osRtnoDNrJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NfUHL4osRtnoDNrJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-NfUHL4osRtnoDNrJ .icon-shape,#mermaid-svg-NfUHL4osRtnoDNrJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NfUHL4osRtnoDNrJ .icon-shape p,#mermaid-svg-NfUHL4osRtnoDNrJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NfUHL4osRtnoDNrJ .icon-shape .label rect,#mermaid-svg-NfUHL4osRtnoDNrJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NfUHL4osRtnoDNrJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NfUHL4osRtnoDNrJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NfUHL4osRtnoDNrJ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

memoryview 方式

传统方式: bytes/bytearray

切片操作

创建视图

指向同一块内存

原始数据源

新分配的内存块

新的 bytes 对象

原始数据源

memoryview 对象

原始内存地址 0x12345678

❌ 传统切片: O(N) 时间 + O(N) 空间 涉及内存分配和数据拷贝

✅ memoryview: O(1) 时间 + O(1) 空间 仅创建元数据,无数据拷贝


2. 为什么要提供 memoryview?

在处理大量二进制数据(如网络包、图像像素、音频波形、文件IO)时,性能至关重要。

核心价值

  • 零拷贝(Zero-Copy):

    • 避免在子进程、线程或函数间传递大数据时发生昂贵的内存复制。
    • 对于 GB 级别的数据,拷贝可能耗时毫秒级,而 memoryview 几乎是纳秒级。
  • 可变性共享(Shared Mutability):

    • 如果底层对象是可变的(如 bytearray),通过 memoryview 修改数据会直接反映在原始对象上。
    • 这对于处理缓冲区、共享内存非常有用。
  • 多维数据访问:

    • memoryview 支持类似 NumPy 的多维切片和步长(stride)访问,无需引入重型库即可处理简单的矩阵数据。
  • 符合缓冲区协议(Buffer Protocol):

    • 它是 Python C API 中缓冲区协议的直接暴露,允许 Python 代码高效地与 C 扩展(如 numpy, Pillow, sqlite3)交互。

  • 3. 使用方式与 API

    基本语法

    # 1. 创建 memoryview
    data = bytearray(b'Hello World')
    mv = memoryview(data)

    # 2. 读取数据(不拷贝)
    print(mv[0]) # 72 (ord('H'))
    print(mv[1:5]) # <memory at 0x…> (仍然是一个 memoryview,不是 bytes!)
    print(bytes(mv[1:5])) # b'ello' (此时才拷贝成 bytes)

    # 3. 修改数据(如果底层对象可变)
    mv[0] = ord('h') # 直接修改底层 bytearray
    print(data) # bytearray(b'hello World') -> 原始数据被改变!

    流程图:数据流向

    bytearray (底层缓冲)memoryviewPython 应用bytearray (底层缓冲)memoryviewPython 应用#mermaid-svg-tDsdaoJSvoMHMdW1{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tDsdaoJSvoMHMdW1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tDsdaoJSvoMHMdW1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tDsdaoJSvoMHMdW1 .error-icon{fill:#552222;}#mermaid-svg-tDsdaoJSvoMHMdW1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tDsdaoJSvoMHMdW1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tDsdaoJSvoMHMdW1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tDsdaoJSvoMHMdW1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tDsdaoJSvoMHMdW1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tDsdaoJSvoMHMdW1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tDsdaoJSvoMHMdW1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tDsdaoJSvoMHMdW1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tDsdaoJSvoMHMdW1 .marker.cross{stroke:#333333;}#mermaid-svg-tDsdaoJSvoMHMdW1 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tDsdaoJSvoMHMdW1 p{margin:0;}#mermaid-svg-tDsdaoJSvoMHMdW1 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tDsdaoJSvoMHMdW1 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-tDsdaoJSvoMHMdW1 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-tDsdaoJSvoMHMdW1 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-tDsdaoJSvoMHMdW1 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-tDsdaoJSvoMHMdW1 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-tDsdaoJSvoMHMdW1 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-tDsdaoJSvoMHMdW1 .sequenceNumber{fill:white;}#mermaid-svg-tDsdaoJSvoMHMdW1 #sequencenumber{fill:#333;}#mermaid-svg-tDsdaoJSvoMHMdW1 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-tDsdaoJSvoMHMdW1 .messageText{fill:#333;stroke:none;}#mermaid-svg-tDsdaoJSvoMHMdW1 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tDsdaoJSvoMHMdW1 .labelText,#mermaid-svg-tDsdaoJSvoMHMdW1 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-tDsdaoJSvoMHMdW1 .loopText,#mermaid-svg-tDsdaoJSvoMHMdW1 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-tDsdaoJSvoMHMdW1 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-tDsdaoJSvoMHMdW1 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-tDsdaoJSvoMHMdW1 .noteText,#mermaid-svg-tDsdaoJSvoMHMdW1 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-tDsdaoJSvoMHMdW1 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tDsdaoJSvoMHMdW1 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tDsdaoJSvoMHMdW1 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-tDsdaoJSvoMHMdW1 .actorPopupMenu{position:absolute;}#mermaid-svg-tDsdaoJSvoMHMdW1 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-tDsdaoJSvoMHMdW1 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-tDsdaoJSvoMHMdW1 .actor-man circle,#mermaid-svg-tDsdaoJSvoMHMdW1 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-tDsdaoJSvoMHMdW1 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}仅存储指针、长度、格式信息无数据拷贝创建 bytearray(b'ABCDEF')mv = memoryview(Buf)mv[1:3]计算偏移量和长度返回新的 memoryview (指向 Buf+1, len=2)mv[1] = 99 ('c')直接写入内存地址 Offset+1底层数据变为 'AcCDEF'


    4. 关键特性详解

    4.1 切片不拷贝(Chaining Views)

    这是 memoryview 最强大的地方。你可以对 memoryview 进行多次切片,每次都不会复制数据,直到你最终将其转换为 bytes 或 bytearray。

    import sys

    # 模拟一个大数据包
    large_data = bytearray(10_000_000) # 10 MB
    for i in range(len(large_data)):
    large_data[i] = i % 256

    # 传统方式:每次切片都拷贝 10MB -> 5MB -> 1KB,浪费巨大
    part1 = large_data[:5_000_000]
    part2 = part1[:1024]

    # ✅ memoryview 方式:无拷贝,极快
    mv = memoryview(large_data)
    mv_part1 = mv[:5_000_000] # O(1)
    mv_part2 = mv_part1[:1024] # O(1)

    # 只有当你需要真正的 bytes 对象时才转换
    final_bytes = bytes(mv_part2) # 这里才发生 1KB 的拷贝

    4.2 多维数组支持

    memoryview 可以解释为多维数组,前提是底层数据是连续的且格式已知。

    # 创建一个 4×4 的字节矩阵
    data = bytearray(range(16)) # [0, 1, 2, …, 15]
    mv = memoryview(data).cast('B', shape=(4, 4))

    print(mv.shape) # (4, 4)
    print(mv[0, 0]) # 0
    print(mv[1, 2]) # 6 (第1行第2列)

    # 提取一行(零拷贝)
    row_1 = mv[1] # <memory at …>
    print(list(row_1)) # [4, 5, 6, 7]

    # 提取一列(零拷贝,通过步长)
    col_2 = mv[:, 2]
    print(list(col_2)) # [2, 6, 10, 14]

    4.3 类型转换(Cast)

    你可以改变看待同一块内存的方式(例如,将字节视为整数)。

    import struct

    # 假设内存中有两个 32位整数
    data = bytearray(struct.pack('<II', 100, 200)) # Little-endian unsigned int
    mv = memoryview(data)

    # 将字节视图转换为整数视图
    int_mv = mv.cast('I') # 'I' 表示 unsigned int (4 bytes)
    print(int_mv[0]) # 100
    print(int_mv[1]) # 200

    # 修改整数会影响原始字节
    int_mv[0] = 999
    print(data) # bytearray(b'\\xe7\\x03\\x00\\x00\\xc8\\x00\\x00\\x00')


    5. 实战示例

    示例 1:高效处理网络数据包

    在网络编程中,经常需要从一个大缓冲区中提取头部和负载。

    def process_packet(buffer: bytearray):
    """
    模拟处理一个网络包:
    前 4 字节是长度,接下来 2 字节是类型,剩余是负载。
    """

    mv = memoryview(buffer)

    # 零拷贝提取头部
    header_len = mv[:4]
    header_type = mv[4:6]
    payload = mv[6:]

    # 解析长度(假设小端序)
    import struct
    length = struct.unpack('<I', bytes(header_len))[0]
    type_code = struct.unpack('<H', bytes(header_type))[0]

    print(f"Length: {length}, Type: {type_code}")

    # 只有当需要发送或存储负载时,才拷贝 payload
    if type_code == 1:
    save_to_disk(bytes(payload))

    # 测试
    buf = bytearray(1024)
    buf[:4] = struct.pack('<I', 100)
    buf[4:6] = struct.pack('<H', 1)
    process_packet(buf)

    示例 2:图像处理(模拟像素操作)

    假设我们有一个灰度图像,每个像素占 1 字节。

    def invert_image_pixels(image_data: bytearray):
    """
    反转图像像素颜色 (255 – pixel)
    使用 memoryview 避免创建中间列表
    """

    mv = memoryview(image_data)

    # 方法 A: 循环修改(原地修改,无额外内存分配)
    for i in range(len(mv)):
    mv[i] = 255 mv[i]

    # 方法 B: 如果数据量大,可以使用 numpy 配合 memoryview 更快
    # import numpy as np
    # arr = np.frombuffer(mv, dtype=np.uint8)
    # np.invert(arr, out=arr)

    # 测试
    img = bytearray([0, 128, 255, 10])
    invert_image_pixels(img)
    print(list(img)) # [255, 127, 0, 245]

    示例 3:与 C 扩展库交互

    许多库(如 sqlite3, zlib, ssl)接受 memoryview 作为输入,以避免内部拷贝。

    import zlib

    data = b"x" * 1000000 # 1MB 数据
    mv = memoryview(data)

    # zlib.compress 可以直接接受 memoryview,无需先转 bytes
    compressed = zlib.compress(mv)
    print(len(compressed))


    6. 注意事项与陷阱

    问题描述解决方案
    不可变性 如果底层对象是 bytes(不可变),memoryview 也是只读的。尝试写入会抛出 TypeError。 使用 bytearray 作为底层对象如果需要修改。
    生命周期 memoryview 持有对底层对象的引用。只要 memoryview 存在,底层对象就不会被垃圾回收。 注意不要长时间持有大对象的 memoryview,以免内存泄漏。
    释放内存 memoryview 本身很小,但它锁住了底层大内存。 使用 del mv 或 mv.release() (Python 3.12+) 来显式释放对底层的引用。
    线程安全 memoryview 不是线程安全的。如果多个线程同时读写同一个 memoryview,需要加锁。 使用 threading.Lock 保护对共享 memoryview 的访问。

    7. 总结模块图

    #mermaid-svg-OMC7S7Bip8a50OiB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OMC7S7Bip8a50OiB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OMC7S7Bip8a50OiB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OMC7S7Bip8a50OiB .error-icon{fill:#552222;}#mermaid-svg-OMC7S7Bip8a50OiB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OMC7S7Bip8a50OiB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OMC7S7Bip8a50OiB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OMC7S7Bip8a50OiB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OMC7S7Bip8a50OiB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OMC7S7Bip8a50OiB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OMC7S7Bip8a50OiB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OMC7S7Bip8a50OiB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OMC7S7Bip8a50OiB .marker.cross{stroke:#333333;}#mermaid-svg-OMC7S7Bip8a50OiB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OMC7S7Bip8a50OiB p{margin:0;}#mermaid-svg-OMC7S7Bip8a50OiB .edge{stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .section–1 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section–1 path,#mermaid-svg-OMC7S7Bip8a50OiB .section–1 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section–1 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section–1 text{fill:#ffffff;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth–1{stroke-width:17;}#mermaid-svg-OMC7S7Bip8a50OiB .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-0 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-0 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-0 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-0 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-0 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-0{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-0{stroke-width:14;}#mermaid-svg-OMC7S7Bip8a50OiB .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-1 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-1 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-1 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-1 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-1 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-1{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-1{stroke-width:11;}#mermaid-svg-OMC7S7Bip8a50OiB .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-2 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-2 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-2 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-2 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-2 text{fill:#ffffff;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-2{stroke-width:8;}#mermaid-svg-OMC7S7Bip8a50OiB .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-3 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-3 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-3 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-3 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-3 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-3{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-3{stroke-width:5;}#mermaid-svg-OMC7S7Bip8a50OiB .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-4 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-4 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-4 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-4 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-4 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-4{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-4{stroke-width:2;}#mermaid-svg-OMC7S7Bip8a50OiB .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-5 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-5 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-5 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-5 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-5 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-5{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-5{stroke-width:-1;}#mermaid-svg-OMC7S7Bip8a50OiB .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-6 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-6 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-6 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-6 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-6 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-6{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-6{stroke-width:-4;}#mermaid-svg-OMC7S7Bip8a50OiB .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-7 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-7 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-7 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-7 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-7 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-7{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-7{stroke-width:-7;}#mermaid-svg-OMC7S7Bip8a50OiB .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-8 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-8 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-8 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-8 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-8 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-8{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-8{stroke-width:-10;}#mermaid-svg-OMC7S7Bip8a50OiB .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-9 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-9 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-9 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-9 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-9 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-9{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-9{stroke-width:-13;}#mermaid-svg-OMC7S7Bip8a50OiB .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-10 rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-10 path,#mermaid-svg-OMC7S7Bip8a50OiB .section-10 circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-10 polygon,#mermaid-svg-OMC7S7Bip8a50OiB .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-10 text{fill:black;}#mermaid-svg-OMC7S7Bip8a50OiB .node-icon-10{font-size:40px;color:black;}#mermaid-svg-OMC7S7Bip8a50OiB .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .edge-depth-10{stroke-width:-16;}#mermaid-svg-OMC7S7Bip8a50OiB .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled,#mermaid-svg-OMC7S7Bip8a50OiB .disabled circle,#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:lightgray;}#mermaid-svg-OMC7S7Bip8a50OiB .disabled text{fill:#efefef;}#mermaid-svg-OMC7S7Bip8a50OiB .section-root rect,#mermaid-svg-OMC7S7Bip8a50OiB .section-root path,#mermaid-svg-OMC7S7Bip8a50OiB .section-root circle,#mermaid-svg-OMC7S7Bip8a50OiB .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-OMC7S7Bip8a50OiB .section-root text{fill:#ffffff;}#mermaid-svg-OMC7S7Bip8a50OiB .section-root span{color:#ffffff;}#mermaid-svg-OMC7S7Bip8a50OiB .section-2 span{color:#ffffff;}#mermaid-svg-OMC7S7Bip8a50OiB .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-OMC7S7Bip8a50OiB .edge{fill:none;}#mermaid-svg-OMC7S7Bip8a50OiB .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-OMC7S7Bip8a50OiB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    memoryview

    核心优势

    零拷贝 Zero-Copy

    原地修改 In-place Mutation

    多维视图 Multi-dimensional

    适用场景

    网络包解析

    图像处理

    大数据分片

    C 扩展交互

    底层机制

    缓冲区协议 Buffer Protocol

    指针 + 长度 + 步长

    引用计数保持底层对象存活

    最佳实践

    优先使用 bytearray 作为源

    切片后及时转为 bytes 如需持久化

    注意内存生命周期

    何时使用 memoryview?

  • 数据量 > 1KB:小数据拷贝开销可忽略,memoryview 优势不明显。
  • 频繁切片:如果对同一块数据进行多次切片操作。
  • 需要原地修改:希望修改子集并反映到原数据。
  • 与底层库交互:调用接受 buffer 对象的 C 扩展。
  • 否则,对于简单的字符串或小字节处理,直接使用 bytes 或 bytearray 更简单直观。

    赞(0)
    未经允许不得转载:171主机测评 » Python memoryview 深度解析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址