【问题标题】:How to convert c_int_array into python list?如何将 c_int_array 转换为 python 列表?
【发布时间】:2021-04-12 20:46:39
【问题描述】:

我使用python3.8的ctypes来调用C++函数,函数参数是一个数组,它的返回也是一个数组。所以我先创建python列表,然后转换成C++数组调用函数。

ll = ctypes.cdll.LoadLibrary
lib = ll('./ct.so')

nums = [0, 1, 2, 3]
arr = (ctypes.c_int * len(nums))(*nums)
nums2 = lib.method01(arr)

如您所见,nums 是一个 python 列表,我使用 ctypes 将其转换为 C++ 数组,得到arr。然后我通过调用lib.method01(arr) 得到一个C++ 数组nums2

由于nums2是一个C++数组,所以print(nums2)得到的结果是这样的:__main__.c_int_Array_4,这不是一个python数组。那么有什么办法可以把c++数组转成python数组呢?

谢谢

【问题讨论】:

    标签: python c++ arrays numpy ctypes


    【解决方案1】:

    只需致电list(nums2)。示例:

    >>> from ctypes import *
    >>> nums = [0,1,2,3]
    >>> arr = (c_int*4)(*nums)
    >>> arr
    <__main__.c_long_Array_4 object at 0x00000217CE89F7C8>
    >>> list(arr)
    [0, 1, 2, 3]
    

    请注意,如果您的 API 也返回一个指针,这也有效,但需要字符串切片,因为总长度也必须是已知的:

    >>> p = cast(arr,POINTER(c_int))
    >>> p
    <__main__.LP_c_long object at 0x00000217CE89F948>
    >>> p.contents
    c_long(0)
    >>> p[0]
    0
    >>> p[3]
    3
    >>> p[4] # undefined behavior...past end of array.
    0
    >>> p[:4]  # slice to known size
    [0, 1, 2, 3]
    

    仅供参考,正如@user2357112 指出的那样,切片速度快了约 4.5 倍:

    In [1]: from ctypes import *
    In [2]: nums = list(range(5000))
    In [3]: arr = (c_int*5000)(*nums)
    In [4]: %timeit list(arr)
    454 µs ± 9.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    In [5]: %timeit arr[:]
    107 µs ± 2.32 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    

    【讨论】:

      【解决方案2】:

      切片:

      as_list = nums2[:]
      

      这比调用list 运行得更快。 (我认为在 ctypes 文档的任何地方都没有记录 slice-returns-a-list 行为。)

      【讨论】:

        猜你喜欢
        • 2019-06-24
        • 2014-03-03
        • 2019-06-12
        • 2022-01-23
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        相关资源
        最近更新 更多