我有两个要比较的大型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数组而无需额外的内存


基础教程推荐
- Python 页面解析Beautiful Soup库的使用方法 2022-10-20
- Anaconda如何查看自己目前安装的包详解 2023-08-04
- Python中非常好用的内置函数详解 2023-08-04
- 通过python-turtle库实现绘制图画 2023-08-09
- centos7安装python3 以及tab补全功能 2023-09-03
- YOLOv5改进系列之增加小目标检测层 2022-10-20
- 在GNU / Linux中安装python模块 2023-11-10
- python进程与线程的操作 2023-11-10
- 详解TensorFlow训练网络两种方式 2023-08-11
- python locust在linux下的安装 2023-09-04