python-比较ctypes数组而无需额外的内存

我有两个要比较的大型ctypes数组,没有额外的内存.直接比较不起作用: a = ctypes.create_string_buffer(b1*0x100000) b = ctypes.create_string_buffer(b1*0x100000) a == bFalse使用value或raw属性...

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

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

使用value或raw属性都会在内存中创建数组的副本.

使用memoryview封装两个缓冲区会使速度大大降低.

对于Windows,可能的解决方案是直接使用msvcrt.memcmp,但是是否有更多的pythonic方式或跨平台方式来做到这一点?

解决方法:

可以使用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方法.它使用生成器来一次比较每个元素,而不是将整个数组复制到其他位置然后进行比较.

len(a) == len(b) and all(x == y for x, y in zip(a,b))

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

本文标题为:python-比较ctypes数组而无需额外的内存

基础教程推荐