在Python中,有没有更快的方法将bytearray复制到mmap切片中?

5 投票
1 回答
1307 浏览
提问于 2025-04-18 15:20

我正在为XBMC写一个插件,这个插件的功能是将一个以字节数组形式提供的图片复制到一个内存映射对象的某个切片上。通过Kern的行分析工具,我发现代码的瓶颈出现在将字节数组复制到内存映射对象的合适位置时。简单来说就是:

length = 1920 * 1080 * 4
mymmap = mmap.mmap(0, length + 11, 'Name', mmap.ACCESS_WRITE)
image = capture.getImage()  # This returns a bytearray that is 4*1920*1080 in size
mymmap[11:(11 + length)] = str(image)  # This is the bottleneck according to the line profiler

我无法更改图片或内存映射对象的数据类型。XBMC提供的图片是字节数组,而内存映射接口是由一个开发者设计的,他不打算更改这个实现。需要注意的是,这个接口并不是用来写入文件的,而是他用来将数据从XBMC转移到他的C++应用程序中的一种方式。我知道他可以使用ctypes来写一个接口,可能会处理得更好,但他对进一步开发不感兴趣。XBMC中的Python实现是2.7版本。

我考虑过自己用ctypes(在Python内部自包含的方式)来使用memmove,但我还不太明白如何将字节数组和内存映射切片转换成可以与memmove一起使用的C结构,也不知道这样做是否会更快。有没有什么快速的方法可以在这两种数据类型之间移动这些字节?

1 个回答

1

如果你在给 mmap 对象赋值的时候遇到性能瓶颈,我觉得没什么办法能让你的代码更快。因为这个赋值操作内部其实就是在调用 memcpy,也就是内存复制的意思。

撰写回答