JDS*_*JDS 7 python bytearray python-internals
从可变bytearray类型转换为非可变bytes类型会产生副本吗?是否有与之相关的成本,或者解释器是否将其视为不可变的字节序列,就像在C++中转换char*为a 一样const char* const?
ba = bytearray()
ba.extend("some big long string".encode('utf-8'))
# Is this conversion free or expensive?
write_bytes(bytes(ba))
Run Code Online (Sandbox Code Playgroud)
这是不同的Python 3,bytes它自己的类型和Python 2.7,bytes它只是一个别名str?
Mar*_*ers 14
创建一个新副本,在Python 2或3中,不在bytesarray新bytes对象之间共享缓冲区.
您无法共享它,因为该bytesarray对象仍可在其他地方引用并改变该值.
有关详细信息,请参阅bytesobject.c源代码,其中缓冲区协议用于创建数据的直接副本(via PyBuffer_ToContiguous()).
Martjin是对的.我只想用cpython源代码回答这个问题.
在这里查看字节的来源,首先bytes_new调用,它将调用PyBytes_FromObject,它将调用,这将_PyBytes_FromBuffer创建一个新的字节对象和调用PyBuffer_ToContiguous(在此处定义).这调用buffer_to_contiguous,这是一个内存复制功能.该函数的注释如下:
将src复制到连续的表示.订单是'C','F'(Fortran)或'A'(任意)之一.假设:src有PyBUF_FULL信息,src-> ndim> = 1,len(mem)== src-> len.
因此,使用bytearray参数调用字节将复制数据.
| 归档时间: |
|
| 查看次数: |
8720 次 |
| 最近记录: |