我正在为XBMC添加一个插件的代码,它将bytearray中提供的图像复制到mmap对象的切片中.使用Kern的行分析器,我的代码中的瓶颈是当我将bytearray复制到适当位置的mmap对象时.在本质上:
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
Run Code Online (Sandbox Code Playgroud)
我无法更改图像或mmap的数据类型.XBMC将图像作为bytearray提供,mmap接口由不会更改实现的开发人员设计.然而,它不是用来写入文件的 - 这是他从XBMC和他的C++应用程序中获取数据的方式.我认识到他可以使用可以更好地处理这个问题的ctypes编写一个接口,但他对进一步的开发不感兴趣.XBMC中的python实现是2.7.
我看了自己用memmove使用ctypes(以自包含的方式使用python)的可能性,但是无法弄清楚如何将bytearray和mmap slice转换为可以与memmove一起使用的c结构而不是知道这会更快.有关在这两种数据类型之间移动这些字节的快速方法的建议吗?
我正在尝试编写一个 python 例程来保存和恢复桌面图标位置。我在 Windows 7 x64 上使用 32 位 python 2.7。使用此处的信息(堆栈交换),我能够从 Windows 用于存储此信息的外部进程列表视图中读取图标名称和位置,但是在使用 LVM_SETITEMPOSITION 设置新位置(或恢复位置)时失败。所有图标最终都位于桌面上的相同位置。“自动排列”和“对齐网格”已关闭。相关代码在底部。警告:如果您运行此代码,您的所有图标都将成堆:(
import ctypes
class LVITEMW(ctypes.Structure):
_fields_ = [
('mask', ctypes.c_uint32),
('iItem', ctypes.c_int32),
('iSubItem', ctypes.c_int32),
('state', ctypes.c_uint32),
('stateMask', ctypes.c_uint32),
('pszText', ctypes.c_uint64),
('cchTextMax', ctypes.c_int32),
('iImage', ctypes.c_int32),
('lParam', ctypes.c_uint64), # On 32 bit should be c_long
('iIndent',ctypes.c_int32),
('iGroupId', ctypes.c_int32),
('cColumns', ctypes.c_uint32),
('puColumns', ctypes.c_uint64),
('piColFmt', ctypes.c_int64),
('iGroup', ctypes.c_int32),
]
class POINT(ctypes.Structure):
_fields_ = [('x', ctypes.c_int), ('y', ctypes.c_int)]
def icon_save_restore(savedicons=None, restore=False):
import struct, commctrl, win32gui, win32con, win32api
dthwnd = win32gui.FindWindow(None, 'Program …
Run Code Online (Sandbox Code Playgroud) ctypes ×2
bytearray ×1
icons ×1
listviewitem ×1
mmap ×1
optimization ×1
python ×1
python-2.7 ×1
windows ×1