【笔记】bytes和bytearray还有memoryview

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

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

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;

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 关于 `class image.Image` 的用法参数说明 `class image.Image` 是一种用于处理图像数据的对象类,通常在嵌入式视觉开发框架(如 OpenMV IDE 或其他类似的机器学习/计算机视觉库)中被广泛使用。以下是关于该类及其方法的一些重要参数的详细解释: #### 参数详解 1. **buffer**: 这是一个可选参数,表示初始化图像对象时使用的内存缓冲区。它可以是从外部加载的数据或者预先分配好的字节序列。如果未提供此参数,则会创建一个新的空白图像实例[^1]。 2. **bytes / bytearray**: 当通过二进制字符串 (`bytes`) 或者可变二进制数组 (`bytearray`) 初始化图像时,这些数据会被解析并转换成像素矩阵形式存储到内部结构中。这允许开发者直接从文件或其他输入源读取原始图片数据来构建 Image 对象[^2]。 3. **memoryview**: 使用 Python 的内置类型 MemoryView 可以更高效地传递大块连续内存区域给函数调用方而无需复制整个数据集。对于高性能应用来说非常有用,在这种情况下可以利用 memoryview 来快速导入预存在的图像帧至新的Image 实例当中去[^3]。 4. **copy_to_fb (Frame Buffer)**: 此选项控制是否将新生成的内容写回到设备上的显示缓存区内,默认值可能依据具体实现有所不同;某些平台可能会自动启用它以便即时更新屏幕内容。设置为 False 则意味着仅操作虚拟副本而不影响实际呈现出来的画面效果[^4]. #### 示例代码展示如何创建不同类型的 Images: ```python from machine import Pin, SPI import lcd, sensor, image # 创建基于 Byte Array 的 Image img_from_bytes = image.Image(data=bytearray([0xFF]*64*64), width=64, height=64) # 使用 Memory View 构建另一个 Image data_mv = memoryview(bytearray([0x8F]*128*96)) img_mem_view = image.Image(data=data_mv, w=128, h=96) # 不带任何参数的新建空图层 blank_image = image.Image() ``` 以上展示了三种不同的方式来实例化一个 `image.Image` 类型变量:分别采用了 byte array、memory view 无参构造器的形式。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值