【问题标题】:How to compare cpp and python outputs?如何比较 c++ 和 python 输出?
【发布时间】:2019-01-28 18:19:10
【问题描述】:

我正在尝试在 C++ 中重现 Python 的一些功能。它是一种涉及大量子函数的数值方法。

有没有一种很好的方法可以将 Python 函数的值与我正在编写的 C++ 函数的值进行比较,并且应该反映它们?

有人可以粘贴一些代码或提供迷你教程吗? 还是一些指针或引用?

非常感谢! 阿塔巴特

【问题讨论】:

  • 举例说明,以便更好地掌握
  • 什么价值观?你的意思是像单元测试这样的东西吗?但既然你用“基准测试”标记了这个问题,也许你的意思是别的?
  • 将输出写入两个文件,然后比较文件。
  • 我的意思是例如 numpy.linalg.norm 会给出一定的输出,我想确保它具有足够接近我在 cpp 中编写的 norm 函数的值。我想比较文件会起作用,并且由于在 python 中读取/解析文件更容易,让我的 cpp 单元测试框架将数据写入一些文件,然后我可以编写一个 python 脚本来运行它。只是想知道是否没有“更简单的方法”来做到这一点?

标签: python c++ performance function benchmarking


【解决方案1】:

测试。

为 Python 上的功能编写测试(除非它们已经存在;通常测试 Python 代码)。

将测试移植到 C++。然后让你的 C++ 函数通过测试。理想情况下,将测试作为 makefile 上的目标并尽可能运行它们。


编辑:

可以随机测试,这是否是一个好主意,可能取决于您的具体情况。 经验法则是在每个边界案例中使用几个(您可以使用代码覆盖率来查看是否有您遗漏的案例)。

例如,在我的工作中,我使用需要大量组件的集成测试。我们在给定时间点使用硬编码的服务器响应模拟投注过程(除用户界面外的所有过程),并通过重定向到 bmp 来模拟硬件打印机。

现在,您无法测试所有内容。我无法以所有可能的顺序测试每个有效的数字组合(从 0 到 36 的 6 个数字?)。我也不能测试每个无效的组合(无限?)。你测试一对。有意义的。

所以我们总是给它相同的数字。测试是它必须始终生成相同的 bmp(必须呈现相同的字体、必须具有相同的文本、相同的投注日期等)。

现在,生成此测试的自动化程度取决于您的代码和您的应用程序。

我不知道您的具体情况,但我会开始创建一个使用您的库的小程序(越简单越好)。 Python 中的一种实现,C++ 中的一种实现。例如,如果您正在测试一个字符串库,您可以编写一个小程序来删除字符串中的一个字母、添加一个文本、删除所有其他字母等。

然后你自动化几个测试用例:

cat largetext.txt | ./my_python_program > output.pyhthon_program.txt
cat largetext.txt | ./my_cpp_program > output.cpp_program.txt
diff output.pyhthon_program.txt output.cpp_program.txt || echo "ERROR"

理想的情况是,每次编译时,测试都会运行(如果代码简单,则可以这样做;如果不简单,则可以在一天结束时进行测试,例如)。

这并不授予程序是相同的(你不能测试每一个可能的输入)。但是会给你一些信心。如果您发现有问题,您首先将其添加到您的测试中,然后使其失败,然后修复它直到它通过

问候。

【讨论】:

  • 亲爱的 Mirko,这当然是一个选择,但我正在考虑更“随机测试”,例如通过生成随机向量或矩阵(很多)并查看输出是否几乎相同所有实例。
  • 我在想另一个想法是在 ZMQ 中编写一个提供程序模块,两个 zmq 模块,一个在 python 中,另一个在 cpp 中,然后另一个模块吃掉输出并比较它们。但是您的方法实现起来要简单得多,缺点是必须再次用 C++ 和 Python 定义所有测试用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-13
  • 2012-12-10
相关资源
最近更新 更多