代码之家  ›  专栏  ›  技术社区  ›  Jay

纯python模式下的cython数组

  •  -1
  • Jay  · 技术社区  · 6 年前

    我希望解压通过套接字传输的列数据——一堆int,然后是一堆float等等,所以它比使用socket更快 struct.unpack

    我曾考虑使用cython数组,但找不到如何在常规python脚本中使用它,正如cython示例所使用的那样 from cpython cimport array

    我想知道是否有可能在纯python模式下定义cython数组(类似于 cython.locals ),如果是,如何进行。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Pierre de Buyl    6 年前

    Cython可以处理C型数组(即指向内存位置的指针)和 typed memoryviews .实际上,MemoryView对应于NumPy数组或 buffer objects .

    C型阵列很难手动管理,而NumPy阵列在内存管理方面更方便。在实践中,NumPy数组/MemoryView/buffer对象上的性能与数据存储是“Ãla C”完成的一样(指向内存位置的指针),我强烈建议使用NumPy管理数据并将其传递。只要计算代码是Cython/C/C++,任何知道缓冲区协议的Cython或Python代码都允许C速度计算。

        2
  •  0
  •   Jay    5 年前

    我的问题是以最小的开销反序列化列数据。

    我在纯Python的MemoryView中找到了解决方案,使用cast()选项:

    from struct import pack, unpack
    
    # Generate sample packed data
    # data = 1,2
    # pack('2i', *data)
    # Result: b'\x01\x00\x00\x00\x02\x00\x00\x00'
    
    # Unpack sample columnar data coming from socket
    socket_data = b'\x01\x00\x00\x00\x02\x00\x00\x00'
    memoryview(socket_data ).cast('i').tolist()
    # Result: [1,2]
    

    这允许创建一次memoryview,然后在需要时将数据分块解压。