【笔记】bytes和bytearray还有memoryview

本文探讨了Python中bytes、bytearray和memoryview的区别与性能,指出for循环比while快,memoryview主要维护字节缓冲区指针,其tobytes方法开销大,而bytearray切片会导致内存拷贝,影响效率。同时,开辟和生成字节数组速度较慢,但字节拷贝本身速度快。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import cProfile
import uuid
from http.client import HTTPResponse

s = uuid.uuid1().bytes * 10000


def r0():
    for i in range(100000):
        s


def r1():
    for i in range(100000):
        memoryview(s)


def r2():
    for i in range(100000):
        memoryview(s).tobytes()


def r3():
    b = bytearray(len(s))
    for i in range(100000):
        b[:] = s


def r4():
    b = bytearray(len(s))
    b = memoryview(b)
    for i in range(100000):
        b[:] = s

def r5():
    for i in range(100000):
        bytearray(len(s))
def r6():
    for i in range(100000):
        bytearray(s)
def r7():
    from copy import deepcopy
    for i in range(100000):
        deepcopy(s)

if __name__ == '__main__':
    cProfile.run('r0()')
    cProfile.run('r1()')
    cProfile.run('r2()')
    cProfile.run('r3()')
    cProfile.run('r4()')
    cProfile.run('r5()')
    cProfile.run('r6()')
    cProfile.run('r7()')
	

输出

r0 0.003
r1 0.019
r2 1.482
r3 1.055
r4 0.449
r5 1.076
r6 1.251
r7 0.142

一些理解,不一定对
1.python for 循环很快(3ms),比while快(4ms)
2.memoryview只是维护了指向字节缓冲区对象的指针。
3.memoryview.tobytes方法开销巨大,每次都拷贝字节对象生成新的字节对象。
4.memoryview维护bytearray切片写入,只涉及底层字节拷贝。
5.bytearray切片会触发内存拷贝,所以比memoryview方式要慢一倍。
6.开辟字节长度的字节数组很慢。
7.生成字节内容的字节数组很慢,比只开辟内存还要慢一点。
8.字节的拷贝不生成新的字节,所以很快。

参考
Memoryview 一起 Python 点乐子
bytes, bytearray 和 memoryview 在逻辑上可以类比以下 C 描述:

// bytes
char * data = "hello world";

// bytearray
char data[12] = "hello world";

// memoryview
char *p = data;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值