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

如何无拷贝将datetime64[ns]数组传递给pybind11

问题1:pybind11是否有对应datetime64[ns]的专用类型?

pybind11官方未提供适配numpy datetime64[ns]的内置专用类型,无法直接以py::array_t<DateTime>的形式原生接收该类数组,需要自行做底层内存适配。

问题2:无拷贝传递的实现方案

存在完全轻量无拷贝的方案,无需复制数组内存,datetime64[ns]底层本身就是以连续int64类型存储纳秒时间戳,有两种常用实现路径:

路径1:C++侧直接接收datetime64数组,自行解析底层数据

无需Python侧做任何预处理,C++侧先做类型校验后直接读取底层int64指针即可,示例代码如下:

#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>

namespace py = pybind11;

void process_datetime_arr(py::array arr) {
    // 校验输入类型合法性
    if (py::str(arr.dtype()) != "datetime64[ns]") {
        throw std::runtime_error("仅支持datetime64[ns]类型的数组输入");
    }
    // 直接获取底层int64指针,无任何内存拷贝
    const int64_t* data = static_cast<const int64_t*>(arr.data());
    const py::ssize_t arr_size = arr.size();

    // 遍历读取纳秒时间戳执行业务逻辑即可
    for (py::ssize_t i = 0; i < arr_size; ++i) {
        int64_t ns_timestamp = data[i];
        // 你的自定义处理逻辑
    }
}

PYBIND11_MODULE(example_moudle, m) {
    m.def("process_datetime_arr", &process_datetime_arr, "接收并处理datetime64[ns]数组");
}

Python侧调用时直接传入datetime64数组即可:

import numpy as np
import example_moudle

test_arr = np.array(['2024-01-01', '2024-01-02', '2024-01-03'], dtype='datetime64[ns]')
example_moudle.process_datetime_arr(test_arr)

路径2:Python侧生成无拷贝视图后传递

如果希望C侧代码更简洁,不需要处理类型校验,可以在Python侧先做dtype视图转换,该操作完全无拷贝,和原数组共享底层内存:
C
侧直接接收int64数组即可:

#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>

namespace py = pybind11;

void process_datetime_arr(py::array_t<int64_t> arr) {
    auto arr_view = arr.unchecked<1>(); // 1维数组场景,多维可调整模板参数
    for (py::ssize_t i = 0; i < arr_view.shape(0); ++i) {
        int64_t ns_timestamp = arr_view(i);
        // 你的自定义处理逻辑
    }
}

PYBIND11_MODULE(example_moudle, m) {
    m.def("process_datetime_arr", &process_datetime_arr, "处理转换后的datetime时间戳数组");
}

Python侧调用代码:

import numpy as np
import example_moudle

test_arr = np.array(['2024-01-01', '2024-01-02', '2024-01-03'], dtype='datetime64[ns]')
# 生成int64视图,无内存拷贝
int_view = test_arr.view('int64')
example_moudle.process_datetime_arr(int_view)

注意事项

  • 两种方案的性能和直接传递原生int64数组完全一致,没有额外开销
  • 如果需要修改数组内容,操作会直接同步到原Python侧的datetime64数组,因为二者共享内存
  • 传递前建议确认datetime的单位为ns,避免时间戳单位不匹配导致逻辑错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:24:04