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

被折叠的 条评论
为什么被折叠?



