比较没有额外内存的ctypes数组

2024-04-24 23:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个大的ctypes数组,我想比较,没有额外的内存。直接比较不起作用:

>>> a = ctypes.create_string_buffer(b'1'*0x100000)
>>> b = ctypes.create_string_buffer(b'1'*0x100000)
>>> a == b
False

使用valueraw属性在内存中创建数组的副本。在

使用memoryview来包装两个缓冲区会大大降低速度。在

对于windows,一个可能的解决方案是直接使用msvcrt.memcmp,但是有没有一种更像python的方式或者跨平台的方式来实现呢?在


Tags: 内存falsestringraw属性valuebuffercreate
1条回答
网友
1楼 · 发布于 2024-04-24 23:23:14

可以使用ctypes.util.find_library以独立于平台的方式找到特定的C库。库公开的函数可以根据需要使用。在

因此,可以通过执行以下操作来比较数组:

libc_name = ctypes.util.find_library("c")
libc = ctypes.CDLL(libc_name)

libc.memcmp.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.c_size_t)

len(a) == len(b) and libc.memcmp(a, b, len(a)) == 0

请注意,如果调用不正确,这些函数调用是非常不宽容的。通过设置函数的argtypes,可以使函数在调用库函数之前检查其参数。在

在不使用大量额外内存的情况下,比较数组的纯python方法如下。它使用一个生成器,一次比较每个元素,而不是将整个数组复制到其他地方然后进行比较。在

^{pr2}$

这样做的缺点是,将创建许多对象,每个对象的内存占用很小,这将以其自身的计算开销(CPU而不是内存)来创建。在

相关问题 更多 >