前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从Python传递参数到C++

从Python传递参数到C++

作者头像
王云峰
发布于 2023-10-21 08:30:22
发布于 2023-10-21 08:30:22
43600
代码可运行
举报
运行总次数:0
代码可运行

概述

有些场景下,需要将Python里面计算得到的参数或者结果传入到C++来进行工程部署。一个常见问题是,Python该以什么格式 (二进制还是文本) 保存这些参数,然后从C++代码里面来读取呢,各有什么优劣?这里我们简单实验一下,并写一些趁手的代码,供查阅。

二进制格式和文本格式对比

假设我们有一组参数是存储在Numpy的ndarray格式中的,为了在C++中使用,我们需要保存它们到硬盘的文件中。一般有两种保存方法:二进制文件保存和文本文件保存。

假设我们有一个1024x1024的浮点型参数待保存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
params = np.random.rand(1024, 1024).astype('float32')

二进制保存很简单,直接调用Numpy的tofile文件即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
params.tofile("params.bin")

如果用文本文件保存,有两种保存方式,分别为调用savetxt函数和将每个值转换为str并用分隔符分开依次存入文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 文本文件保存方式1
np.savetxt("params_1.txt", params)

# 文本文件保存方式2
delimiter = " "
with open("params_2.txt", "w") as f:
    for p in params:
        f.write(str(p) + delimiter)

猜猜看这三种情况分别大小是多少?

结论如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
4.0M params.bin
25M params_1.txt
11M params_2.txt

可以看到,二进制格式存储空间是最小的,分别是两种文本形式存储空间的16%和36%,存储压缩比例还是比较明显的。

因此推荐以二进制形式存储, 存储脚本简单总结如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np

# rand默认格式是float64,我们使用float32就可以
params = np.random.rand(1024, 1024).astype("float32")

# 拉平成一维,为了在C++里面方便处理
params = params.flatten()

params.tofile("params.bin")

C++ 读取二进制文件

C++ 去读二进制的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <fstream>
#include <iostream>
#include <string>

void read_binary(const std::string &file_path, float *data, int size) {
  std::ifstream in_file;
  in_file.open(file_path, std::ios::binary | std::ios::in);
  in_file.read((char *)data, size * sizeof(float));
  in_file.close();
}

int main() {
  std::string file_path = "params.bin";
  int size = 1024 * 1024;

  // 使用stack上空间来创建数组,有大小限制,不推荐
  // float params[size];

  // 使用new来构建heap上空间, 无大小限制,但需要自己释放内存
  float *params = new float[size];
  read_binary(file_path, params, size);

  // 打印前10个参数
  for (int i = 0; i < 10; i++) {
    std::cout << params[i] << std::endl;
  }

  delete[] params;
}

注意新建数组的时候,有在栈上或者堆上构建两种方式,栈上构建有大小限制,如果数组维度太大就会报错,如下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>
int main() {
        int arr[1024*1024*1024];

        return 0;
}

运行会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ g++ stack_over.cpp && ./a.out
[1]    89415 segmentation fault  ./a.out

因此推荐用堆上创建数组,详见上述代码的注释。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​Data Science | 福利列表 | Numpy基础(三)
在我们使用numpy处理了数据之后,可以将数组保存为保存为Numpy专用的二进制格式,当我们这样操作之后,就不能用notepad++等打开看了(乱码)。
咸鱼学Python
2019/10/09
6510
Python之Numpy库常用函数大全(含注释)
前言:最近学习Python,才发现原来python里的各种库才是大头! 于是乎找了学习资料对Numpy库常用的函数进行总结,并带了注释。在这里分享给大家,对于库的学习,还是用到时候再查,没必要死记硬背。  PS:本博文摘抄自中国慕课大学上的课程《Python数据分析与展示》,推荐刚入门的同学去学习,这是非常好的入门视频。
用户7886150
2021/01/13
2K0
Python Numpy包 常用函数总结
学习整理自:http://www.cnblogs.com/TensorSense/p/6795995.html,如有侵权,联系删除
用户7886150
2021/01/01
9000
C/C++读写文本文件、二进制文件「建议收藏」
1. C语言读写文件均通过FILE指针执行操作,其中文本文件的读写用fprintf,fscanf,二进制文件的读写用fread,fwrite
全栈程序员站长
2022/09/05
2.6K0
C/C++文件操作/IO流
直接点 - 磁盘上的文件,就是文件。从文件功能的角度上,文件分有数据文件和程序文件。
二肥是只大懒蓝猫
2023/05/03
8270
C/C++文件操作/IO流
f stream_Streaming
c++的文件流处理其实很简单,前提是你能够理解它。文件流本质是利用了一个buffer中间层。有点类似标准输出和标准输入一样。
全栈程序员站长
2022/09/28
3130
Python:机器学习三剑客之 NumPy
Numpy是高性能科学计算和数据分析的基础包,机器学习三剑客之一。Numpy库中最核心的部分是ndarray 对象,它封装了同构数据类型的n维数组。部分功能如下:
丹枫无迹
2019/09/11
1K0
Python基础入门6_文件和异常
这次将介绍有关文件和异常的处理,包括读写文本文件、二进制文件、JSON 文件,异常处理,以及 pathlib 模块的介绍。
kbsc13
2019/08/16
1.1K0
NumPy-读写文件「建议收藏」
(1) save 函数是以二进制的格式保存数据。 格式: np.save (“./save_arr “, arr1) (2) load 函数是从二进制的文件中读取数据。 格式: np.load(“./ save_arr.npy”) (3) savez 函数可以将多个数组保存到一个文件中。 格式: np.savez(‘./savez_arr’,arr1,arr2) (4) 存储时可以省略扩展名,但读取时不能省略扩展名
全栈程序员站长
2022/08/24
1.1K0
NumPy 文件存取 tofile,fromfile, load,save
NumPy提供了多种存取数组内容的文件操作函数。保存数组数据的文件可以是二进制格式或者文本格式。二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型。
全栈程序员站长
2021/04/07
1.5K0
Python Numpy文件操作方法与实例分享
在数据处理和科学计算中,文件I/O(输入/输出)是一个非常重要的环节,尤其是在需要读取大规模数据集或保存计算结果时,文件读写功能至关重要。Python的Numpy库为我们提供了高效的文件I/O操作,能够轻松处理文本文件和二进制文件,支持各种格式的存储与加载。本文将详细介绍如何使用Numpy读写文本文件和二进制文件,涵盖常见方法以及对应的示例代码,帮助大家掌握Numpy文件I/O操作的要点。
sergiojune
2024/09/20
2880
Python Numpy文件操作方法与实例分享
NumPy 高级教程——存储和加载数据
在实际应用中,数据的存储和加载是数据科学和机器学习工作流程中不可或缺的一部分。NumPy 提供了用于将数组保存到文件以及从文件中加载数组的功能。在本篇博客中,我们将深入介绍 NumPy 中的存储和加载数据的操作,并通过实例演示如何使用这些功能。
Echo_Wish
2024/01/06
4740
Numpy
对数组运算相当于对数组每一个元素进行运算 a = np.arange(24).reshape((2,3,4))
Fred Liang
2018/08/02
9840
Python教程(18)——python文件操作详解
所谓的文件操作是指对计算机中的文件进行读取、写入、修改和删除等操作。简单来说可以分为以下三个部分:
一点sir
2024/01/10
2320
大模型部署框架 FastLLM 简要解析
本文主要是对FastLLM做了一个简要介绍,展示了一下FastLLM的部署效果。然后以chatglm-6b为例,对FastLLM模型导出的流程进行了解析,接着解析了chatglm-6b模型部分的核心实现。最后还对FastLLM涉及到的优化技巧进行了简单的介绍。
BBuf
2023/08/22
8850
大模型部署框架 FastLLM 简要解析
Python:numpy总结(4)
31、chr函数,获取指定的字符 例子: #获取指定的字符for i in range(65,70): print str(chr(i)) 结果: A BCDE 32、random.shuffle 例子: ll=range(9)#返回列表print ll #shuffle函数随机打乱列表中的元素顺序print random.shuffle(ll) print ll 结果: [0, 1, 2, 3, 4, 5, 6, 7, 8] None [8, 5, 1, 4, 2,
昱良
2018/04/04
8660
如何在Python中高效地读写大型文件?
大家好,我是 V 哥。上一篇给大家介绍如何使用 Python 进行文件读写操作的方法,问题来了,如何读写的是大型文件,有没有什么方法来提高效率呢,不要捉急,这一篇来聊聊如何在Python中高效地读写大型文件。
威哥爱编程
2025/01/22
2010
c++ 文件操作详解
C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstream: 可同时读写操作的文件类 (由iostream引申而来) 打开文件(Open a file) 对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何
拾点阳光
2018/05/10
2K0
python中一些数据处理库
Numpy是Python的一个很重要的第三方库,很多其他科学计算的第三方库都是以Numpy为基础建立的。Numpy的一个重要特性是它的数组计算。
用户7886150
2021/01/05
8980
c++ fstream + string 处理大数据
起因 (1)之前处理文本数据时,各种清洗数据用的都是java的File,FileReader/FileWriter,BufferedReader/BufferedWriter等类,详见java读写文件 (2)应用java的原因是java里面的map非常灵活,eclipse编译器更是给力,而且ctrl可以追踪函数等,详见java map的排序 (3)应用java的另一个原因是java里面的string类的字符串处理非常灵活,各种函数是应用尽有。 (4)上面两点算是自己的误解吧,因为c++里面也有也有与之对应
CSDN技术头条
2018/02/08
2.4K0
c++ fstream + string 处理大数据
相关推荐
​Data Science | 福利列表 | Numpy基础(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验