笔记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的主要内容,如果未能解决你的问题,请参考以下文章