本文目录导读:

- 支持更多数据类型(Python 3.3+)
- 多维支持改进(Python 3.4+)
cast()方法增强(Python 3.3+)- 支持
__index__协议(Python 3.8+) - 切片操作改进(Python 3.7+)
- 实用示例:零拷贝数据处理
- 局限性提醒
Python 的内存视图(memoryview)操作在近几个版本中确实变得更加灵活,主要体现在以下几个方面:
支持更多数据类型(Python 3.3+)
memoryview 现在支持更多格式的 struct 格式符号:
import array
# 可以创建不同数据类型的 memoryview
arr = array.array('i', [1, 2, 3, 4, 5])
mv = memoryview(arr)
print(mv.format) # 'i' - 有符号整数
print(mv.itemsize) # 4 字节
# 转换为其他类型视图
mv2 = mv.cast('B') # 转换为无符号字节视图
print(mv2.tolist()) # [1, 0, 0, 0, 2, 0, 0, 0, ...]
多维支持改进(Python 3.4+)
支持创建 numpy 风格的多维视图:
import struct
# 创建一维 memoryview
data = bytearray(range(24))
mv = memoryview(data)
# 重塑为 3D 数组 (2, 3, 4),每个元素是 4 字节整数
mv_3d = mv.cast('I', shape=[2, 3, 2])
print(mv_3d.shape) # (2, 3, 2)
print(mv_3d[0, 1, 0]) # 访问特定元素
cast() 方法增强(Python 3.3+)
cast() 方法现在支持更复杂的内存布局:
# 字节转换为不同数据类型
data = bytearray(b'\x01\x02\x03\x04')
mv = memoryview(data)
# 转换为小端16位整数
mv_int16 = mv.cast('h') # 或 'H' 无符号
print(mv_int16.tolist()) # [0x0201, 0x0403]
# 转换为大端16位整数(需要明确指定)
import struct
if struct.pack('H', 1) == b'\x01\x00': # 小端系统
mv_be = mv.cast('>h')
print(mv_be.tolist()) # [0x0102, 0x0304]
支持 __index__ 协议(Python 3.8+)
memoryview 现在支持 __index__ 协议,可以用于需要整数索引的场景:
# 可以用于索引操作
mv = memoryview(b'hello')
# 之前不能这样用
# 现在支持:
index = 2
print(mv[index]) # 108 (ord('l'))
切片操作改进(Python 3.7+)
切片操作现在支持步长(但数据必须是 contiguous):
mv = memoryview(b'abcdefgh') # 支持步长切片 sliced = mv[1:7:2] print(bytes(sliced)) # b'bdf' # 但注意:非连续步长需要副本 # 某些情况下会自动创建副本
实用示例:零拷贝数据处理
import numpy as np
# 创建大型数组
arr = bytearray(1024 * 1024 * 100) # 100MB
# 使用 memoryview 零拷贝访问
mv = memoryview(arr)
# 转换为不同视图而不复制数据
mv_float = mv.cast('f') # 浮点视图
mv_int = mv.cast('I', shape=[256, 256, 256]) # 3D 整数视图
# 与 numpy 互操作
np_array = np.frombuffer(mv, dtype=np.float32)
# 注意:numpy 和 memoryview 共享同一块内存
局限性提醒
虽然更加灵活,但仍有一些限制:
- 不支持所有格式:某些复杂格式需要
struct支持 - 性能开销:创建 memoryview 本身有少量开销
- 跨平台问题:字节序需要手动处理
# 需要注意字节序
data = bytearray(b'\x01\x00\x00\x00')
mv = memoryview(data)
print(mv.cast('I')[0]) # 取决于系统是大端还是小端
# 明确指定字节序
mv_le = mv.cast('<I') # 小端
mv_be = mv.cast('>I') # 大端
Python 的 memoryview 确实变得更加灵活,特别是:
- 支持更多数据类型和格式
- 多维数组重塑能力增强
- 与
struct模块更好的集成 - 零拷贝数据转换
对于需要进行大量数值计算或内存优化操作的场景,memoryview 是个很有价值但常被忽视的工具。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播