如何零拷贝获取Numpy数组原始字节并拼接为bytearray用于HTTP请求
多Numpy数组零拷贝字节拼接实现方案
你可以直接利用Numpy数组原生支持的Python缓冲区协议,搭配预分配的bytearray做零拷贝写入,完全跳过tobytes()产生临时bytes对象的额外开销。原有的getbuffer()方法废弃后,Numpy已经将缓冲区协议的支持直接集成到了ndarray对象的底层实现中,不需要调用任何额外方法即可直接被Python的缓冲区相关接口识别使用。
实现代码如下:
import numpy as np list_arr = [np.array([1, 2, 3]), np.array([4, 5, 6])] total_nb_bytes = sum(a.nbytes for a in list_arr) # 预分配足够容量的bytearray,仅做一次内存申请 cb = bytearray(total_nb_bytes) offset = 0 for arr in list_arr: # 直接通过缓冲区协议写入对应位置,无中间数据拷贝 cb[offset:offset + arr.nbytes] = arr offset += arr.nbytes
补充说明
- 该方案全程没有产生任何中间临时
bytes对象,所有数组数据直接从Numpy的原始内存地址写入目标bytearray,相比tobytes()实现可以降低大量内存开销和拷贝耗时。 - 若后续需要从拼接后的字节还原Numpy数组,你需要提前记录每个数组的
dtype、shape、字节长度等元信息,避免解码时出现数据错乱。
内容的提问来源于stack exchange,提问作者Bashir Abdelwahed
相关产品推荐
相关产品推荐

