You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android中通过Chaquopy高效向Python服务器传输Numpy数组

高效传输128维numpy数组的最优方案

针对你的人脸识别APP场景,追求极致传输速度的话,二进制序列化是最优选择,完全避开JSON这类文本格式的高开销。以下是具体实现方案:

方法一:Numpy原生二进制序列化(最快,推荐)

直接利用numpy的二进制格式,几乎无额外序列化开销,128维float32数组仅占512字节,传输效率拉满。

客户端(Chaquopy Python代码)

import numpy as np
import requests

# 假设face_embedding是你的128维人脸编码数组(通常为float32类型)
face_embedding = np.random.rand(128).astype(np.float32)

# 直接转成二进制字节流
embedding_bytes = face_embedding.tobytes()

# 发送POST请求,二进制数据作为请求体
response = requests.post(
    "http://你的服务器地址/接收接口",
    data=embedding_bytes,
    headers={"Content-Type": "application/octet-stream"}
)

服务器端还原

import numpy as np

# 读取请求体中的二进制数据
embedding_bytes = request.get_data()
# 还原为numpy数组,注意指定原数组的dtype和shape
face_embedding = np.frombuffer(embedding_bytes, dtype=np.float32).reshape(128)

方法二:Msgpack序列化(兼容扩展场景)

如果后续需要同时传输元数据(如人脸ID、时间戳),msgpack是比JSON快5-10倍的选择,且原生支持二进制。

客户端

import numpy as np
import msgpack_numpy as mpack
import requests

face_embedding = np.random.rand(128).astype(np.float32)
# 打包数组和额外元数据
packed_data = mpack.packb({
    "embedding": face_embedding,
    "timestamp": 1698765432
})

response = requests.post(
    "http://你的服务器地址/接收接口",
    data=packed_data,
    headers={"Content-Type": "application/x-msgpack"}
)

服务器端还原

import numpy as np
import msgpack_numpy as mpack

packed_data = request.get_data()
data = mpack.unpackb(packed_data)
face_embedding = data["embedding"].reshape(128)

关键注意事项

  • 固定数组类型:人脸编码用float32而非float64,直接减半传输字节数
  • 避免文本编码:不要把二进制数据转成Base64(会增加33%的体积),直接用二进制请求体传输
  • Chaquopy依赖配置:在APP的build.gradle中添加所需Python库:
    python {
        pip {
            install "numpy"
            install "msgpack-numpy" // 用msgpack时需要
        }
    }
    

内容的提问来源于stack exchange,提问作者Taner Caslaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:50:37