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

时间:2014-08-06 11:31:14

标签: python ctypes

我有两个大的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,但有更多的pythonic方式或跨平台方式来执行此操作吗?

1 个答案:

答案 0 :(得分:3)

可以使用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,您可以在调用库函数之前检查其参数。

一种纯粹的pythonic方式来比较数组,而不使用大量额外的内存将是如下。它使用生成器,一次比较每个元素,而不是将整个数组复制到别处,然后进行比较。

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

这样做的缺点是会创建许多对象,每个对象的内存占用都很小 - 这些对象将以自己的计算开销(CPU而非内存)来实现。