Python 在没有额外内存的情况下比较ctypes阵列

Python 在没有额外内存的情况下比较ctypes阵列,python,ctypes,Python,Ctypes,我有两个大的ctypes数组,我想比较一下,没有额外的内存。直接比较不起作用: >>> a = ctypes.create_string_buffer(b'1'*0x100000) >>> b = ctypes.create_string_buffer(b'1'*0x100000) >>> a == b False 使用值或原始属性在内存中创建数组的副本 使用memoryview包装两个缓冲区会大大降低速度 对于windows来说,一个可能

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

>>> a = ctypes.create_string_buffer(b'1'*0x100000)
>>> b = ctypes.create_string_buffer(b'1'*0x100000)
>>> a == b
False
使用
原始
属性在内存中创建数组的副本

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


对于windows来说,一个可能的解决方案是直接使用
msvcrt.memcmp
,但是有没有更适合Python的方法或跨平台的方法来实现这一点?

可以使用
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而不是内存)来实现。

ctypes.pythonapi.memcmp
不适用于windows 7上的python 3.4.1。它可能没有被导出。我添加了一个更健壮的方法来访问libc。适用于windows 8和ubuntu 14。您可能还希望了解
cdll
pydll
之间的区别
cdll
释放全局解释器锁,而
pydll
不释放。这意味着,当执行
cddl
函数时,另一个线程可以在另一个处理器上同时执行。