pybind11 导出 C++ map 在 Python 层 get 访问慢的优化方案

pybind11 导出 C++ map 在 Python 层 get 访问慢的优化方案

问题描述

通过 pybind11 导出 C++ 的 std::mapstd::unordered_map,在 Python 代码中频繁使用 get 方法访问 value 时,性能非常低下。其主要原因是:

  • pybind11 的 map 绑定会导致每次访问都跨越 Python/C++ 边界,开销很大。
  • 如果在 Python 层高频访问 C++ map,每次都要进入 C++ 层查找,效率远低于直接用 Python dict。
  • 如果每次都把整个 map 拷贝到 Python(如频繁调用 get_map_as_dict),则会有更大的性能损耗。

解决方案

1. 批量查找,减少跨界调用

设计 C++ 方法,接收一组 key,批量返回对应的 value,减少 Python/C++ 之间的调用次数。

py::dict batch_get(const std::map<std::string, int>& m, const std::vector<std::string>& keys) {py::dict d;for (const auto& key : keys) {auto it = m.find(key);if (it != m.end()) {d[key.c_str()] = it->second;}}return d;
}

pybind11 绑定:

m.def("batch_get", &batch_get);

Python 调用:

keys = ["a", "b", "c"]
result = mod.batch_get(keys)
# result 是 dict,只包含需要的 key

2. 一次性拷贝 map 到 Python,只在 map 不变时用

如果 map 内容不会频繁变化,可以只在初始化时拷贝一次,后续都在 Python 层查找。

3. to_dict 缓存优化

如果 map 很大且只读或低频变更,可以在 C++ 层实现 to_dict 缓存:

  • 第一次调用时将 map 转为 Python dict 并缓存。
  • 后续 map 未变时直接返回缓存,性能极高。
  • map 变更时清空缓存,下次再生成。

示例代码:

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <optional>namespace py = pybind11;class MapWrapper {
public:std::map<std::string, int> m;std::optional<py::dict> cache;py::dict to_dict() {if (cache.has_value()) {return cache.value();}py::dict d;for (const auto& kv : m) {d[kv.first.c_str()] = kv.second;}cache = d;return d;}void insert(const std::string& key, int value) {m[key] = value;cache.reset(); // 数据变了,清空缓存}
};PYBIND11_MODULE(example, m) {py::class_<MapWrapper>(m, "MapWrapper").def(py::init<>()).def("to_dict", &MapWrapper::to_dict).def("insert", &MapWrapper::insert);
}

Python 用法:

w = example.MapWrapper()
w.insert("a", 1)
d = w.to_dict()  # 第一次生成并缓存
d2 = w.to_dict() # 直接返回缓存,速度极快

总结

  • 跨 Python/C++ 边界的高频调用是性能瓶颈,需尽量减少。
  • 推荐批量查找或一次性拷贝到 Python。
  • to_dict 缓存方案适合只读或低频变更场景。
  • map 频繁变更时,建议用 batch_get 等批量查找方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87527.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTC实时时钟DS1339U-33国产替代FRTC1339M

FRTC1339M是一款实时时钟&#xff08;RTC&#xff09;芯片&#xff0c;由NYFEA徕飞公司制造。 FRTC13399M串行实时时钟是一种低功耗的时钟日期设备&#xff0c;具有两个可编程的每日时间警报和一个可编程的方波输出。通过2线双向总线进行串行地址和数据传输。时钟/日期提供秒、…

网络常用端口号归纳

ICMP端口号&#xff1a;1IGMP端口号&#xff1a;2TCP端口号&#xff1a;6UDP端口号&#xff1a;17FTP端口号&#xff1a;20(控制信息传输)、21&#xff08;数据传输&#xff09;SSH端口号&#xff1a;22Telnet端口号&#xff1a;23SMTP端口号&#xff1a;25IPV6端口号&#xff…

Agent learn

1.人物设定&#xff1a; 1.1塑造智能体的思维能力与问题拆解与拆解分析能力 1.2个性化&#xff1a;输出预期输出示例&#xff08;设定智能体的-》性格&#xff0c;语言风格&#xff09; 1.3插件&#xff0c;调用工具 1.4可设定结构化表达 1.5调优 1.6常见问题&#xff1a; …

五层协议介绍

层次核心功能典型协议/设备应用层为用户应用程序提供网络服务接口&#xff08;如文件传输、电子邮件、网页浏览&#xff09;HTTP、FTP、SMTP、DNS、SSH传输层提供端到端的可靠或不可靠数据传输&#xff0c;处理流量控制和差错恢复TCP&#xff08;可靠&#xff09;、UDP&#xf…

gin框架 中间件 是在判断路由存在前执行还是存在后执行的研究

最近有个需求&#xff0c;就是发现我们的验签路由中间件会在判断路由是否存在前执行。我们期望是gin框架先自己判断路由中间件是否存在&#xff0c;存在了再走后面的中间件&#xff0c;不存在直接返回404.这样能节省一定的资源。 研究了一下gin框架的源码&#xff0c; 先说一下…

AGV 无人叉车关键技术问题解析:精准定位算法 / 安全避障逻辑 / 系统对接协议全方案

AGV无人叉车作为智能物流的核心装备&#xff0c;在落地时常面临定位漂移、系统兼容性差、避障失灵等痛点。本文深度解析5大高频问题成因与解决方案&#xff0c;助企业规避运营风险&#xff0c;提升效率。 一、定位导航问题&#xff1a;行驶路径偏移怎么办&#xff1f; 1.典型…

AI Agent意图识别

意图识别&#xff1a;多维度拆解 意图识别是人机对话系统&#xff08;Conversational AI&#xff09;的“大脑皮层”&#xff0c;负责理解用户言语背后的真实目的。它将用户的自然语言输入映射到一个预定义的意图类别上。可以说&#xff0c;意图识别的准确性&#xff0c;直接决…

.net 8 项目 一天快速入门

这里有一个解决方案 这里有一个接口类的项目 这会呢如果还想在建一个项目 我们在解决方案这里右键,添加,新建项目 点击 我现在要建立一个类库,所以就搜一下类库,这里的第一个就是我们需要创建的类库 起个名字,计算类 进来了 可以看到这里有多了一个项目,但是他们…

语音大模型速览(一)F5-TTS

F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching 论文链接&#xff1a;https://arxiv.org/pdf/2410.06885代码链接&#xff1a;https://SWivid.github.io/F5-TTS/ 一段话总结 本文提出了 F5-TTS&#xff0c;一种基于流匹配和扩散 Transform…

Codeforces 2021 C Those Who Are With Us

[Problem Discription]\color{blue}{\texttt{[Problem Discription]}}[Problem Discription] 给定一个 nmn \times mnm 的表格 ai,ja_{i,j}ai,j​&#xff0c;你可以恰好进行一次如下操作&#xff1a; 选择一个格点 (r,c)(r,c)(r,c)。对于所有满足 iririr 或者 jcjcjc 的格点 (…

chrome插件合集

最近一段时间呢(不到一年)&#xff0c;实现了大概二十几个chrome插件。很多人不知道的是&#xff0c;其实开发插件很解压&#xff0c;就好像是我喜欢沿着公园的小路散步一样&#xff0c;每开发一个插件带给我的成就感和快乐都是独特的。我依然记得自己开发出第1个插件时的快乐&…

【机器学习深度学习】模型微调的基本概念与流程

目录 前言 一、什么是模型微调&#xff08;Fine-tuning&#xff09;&#xff1f; 二、预训练 vs 微调&#xff1a;什么关系&#xff1f; 三、微调的基本流程&#xff08;以BERT为例&#xff09; 1️⃣ 准备数据 2️⃣ 加载预训练模型和分词器 3️⃣ 数据编码与加载 4️…

大语言模型预训练数据——数据采样方法介绍以GPT3为例

大语言模型预训练数据——数据采样方法介绍以GPT3为例一、数据采样核心逻辑二、各列数据含义一、数据采样核心逻辑 这是 GPT - 3 训练时的数据集配置&#xff0c;核心是非等比例采样——不按数据集原始大小分配训练占比&#xff0c;而是人工设定不同数据集在训练中被抽取的概率…

针对同一台电脑,为使用不同 SSH Key 的不同用户分别设置 Git 远程仓库凭据的操作指南

一、准备工作 生成多对 SSH Key 为每个用户&#xff08;如“个人”、“公司”&#xff09;生成一对独立的 SSH Key。 示例&#xff08;在 Git Bash 或 Linux 终端中执行&#xff09;&#xff1a; # 个人 ssh-keygen -t rsa -b 4096 -C "personalexample.com" -f ~/.…

【V5.0 - 视觉篇】AI的“火眼金睛”:用OpenCV量化“第一眼缘”,并用SHAP验证它的“审美”

系列回顾&#xff1a; 在上一篇 《给AI装上“写轮眼”&#xff1a;用SHAP看穿模型决策的每一个细节》 中&#xff0c;我们成功地为AI装上了“透视眼镜”&#xff0c;看穿了它基于数字决策的内心世界。 但一个巨大的问题暴露了&#xff1a;它的世界里&#xff0c;还只有数字。 它…

Open3D 基于最大团(MAC)的点云粗配准

MAC 一、算法原理1、原理概述2、实现流程3、总结二、代码实现三、结果展示博客长期更新,本文最新更新时间为:2025年7月1日。 一、算法原理 1、原理概述 最大团(Maximal Cliques, MAC)法在点云配准中的应用,是近年来解决高离群值(outlier)和低重叠场景下配准问题的重要…

Science Robotics发表 | 20m/s自主飞行+避开2.5mm电线的微型无人机!

从山火搜救到灾后勘察&#xff0c;时间常常意味着生命。分秒必争的任务要求无人机在陌生狭窄环境中既要飞得快、又要飞得稳。香港大学机械工程系张富教授团队在Science Robotics(2025)发表论文“Safety-assured High-speed Navigation for MAVs”提出了微型无人机的安全高速导航…

【数据分析】如何在PyCharm中高效配置和使用SQL

PyCharm 作为 Python 开发者的首选 IDE&#xff0c;其 Professional 版本提供了强大的数据库集成功能&#xff0c;让开发者无需切换工具即可完成数据库操作。本文将手把手教你配置和使用 PyCharm 的 SQL 功能。 一、安装和配置 PyCharm 老生常谈&#xff0c;第一步自然是安装并…

OpenShift AI - 使用 NVIDIA Triton Runtime 运行模型

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.18 OpenShift AI 2.19 的环境中验证 文章目录 准备 Triton Runtime 环境添加 Triton Serving Runtime运行基于 Triton Runtime 的 Model Server 在 Triton Runtime 中运行模型准备模型运行…

物联网数据安全区块链服务

物联网数据安全区块链服务 下面是一个专为物联网数据安全设计的区块链服务实现&#xff0c;使用Python编写并封装为RESTful API。该服务确保物联网设备数据的不可篡改性、可追溯性和安全性。 import hashlib import json import time from datetime import datetime from uui…