我有两个大的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方式或跨平台方式来执行此操作吗?
答案 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而非内存)来实现。