笔记bytes和bytearray还有memoryview

Posted azach64

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔记bytes和bytearray还有memoryview相关的知识,希望对你有一定的参考价值。

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;

以上是关于笔记bytes和bytearray还有memoryview的主要内容,如果未能解决你的问题,请参考以下文章

笔记bytes和bytearray还有memoryview

Python学习笔记015——序列(字节数组 bytearray)

Python 序列 - bytes 和 bytearray

流畅的python和cookbook学习笔记

请教Python3 bytearray 的问题

python数据l类型 ——bytes 和 bytearray