【发布时间】:2021-10-30 04:32:02
【问题描述】:
我的 ctype 结构如下:
class BOX(Structure):
_fields_ = [("x", c_float),
("y", c_float),
("w", c_float),
("h", c_float)]
class DETECTION(Structure):
_fields_ = [("cl", c_int),
("bbox", BOX),
("prob", c_float)]
ML 模型通过共享库传递检测结果
lib = CDLL('./libdetector.so', RTLD_GLOBAL)
detect = lib.detect
detect.argtypes = [...]
detect.restype = POINTER(DETECTION)
dets = detect(...)
我的代码工作正常,我检查了结果,它是正确的。但我想按其置信度分数对检测进行排序,所以我使用这一行:
_dets = sorted(dets, key=lambda det: det.prob, reverse=True)
在这一步中,我的计算机内存继续运行,当它已满时,只有“已杀”消息打印到我的控制台。那么,python sorted 是否不适用于 ctype 结构列表?我可以简单地使用for loop 进行排序,但是每个人都希望保持代码整洁美观,不是吗? :3
【问题讨论】:
-
所以,如果它是一个
POINTER(DETECTION)结果,它不是一个列表。但是使用sorted创建一个列表,更重要的是,由ctypes.c_float对象组成,在python级别每个实例需要128字节(整个底层结构将小于一半),另外不要忘记指针的 8 个字节。因此,如果该底层数组已经非常大,这可能会增加您的内存需求...与 C 相比,Python 是一个巨大的内存猪。如果您想有效地使用结构数组,请使用numpy。