Python 在没有额外内存的情况下比较ctypes阵列
我有两个大的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来说,一个可能
>>> 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
函数时,另一个线程可以在另一个处理器上同时执行。