- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已阅读 tutorial and API guide of Numpy ,并且我从这个有用的文档中学习了如何使用我自己的 C 代码扩展 Numpy 或如何使用 C 调用 Numpy 函数。
然而,我真正想知道的是:如何跟踪从 python 代码到 C 实现的调用链?或者我怎么知道它的哪一部分 C implementation对应于这个简单的 numpy 数组加法?
x = np.array([1, 2, 3])
y = np.array([1, 2, 3])
print(x + y)
我可以使用gdb之类的工具一步步跟踪它的栈帧吗?
或者我可以直接从变量命名策略中识别出相应的代码吗? (比如如果我想知道关于加法的代码,我可以搜索类似 function PyNumpyArrayAdd(...) 的东西)
[编辑] 我找到了一个非常有用的视频,介绍了如何指出这些基本的 C 实现函数或运算符覆盖(如“+”“-”)的 C 实现。
https://www.youtube.com/watch?v=mTWpBf1zewc
通过 Numpy 邮件列表从 Andras Deak 那里得到这个。
[EDIT2] 还有另一种方法可以使用 gdb 跟踪 Numpy 中调用的所有函数。它非常重,因为它将显示 Numpy 中所有被调用的函数,包括这些微不足道的函数。这可能需要一些时间。
首先您需要下载/克隆 Numpy 存储库到您自己的工作空间,然后使用 -g
选项编译它,这将附加调试信息以进行调试。
然后在Numpy的setup.py所在的“path/to/numpy-main”目录下打开终端,然后运行gdb。
如果您想知道在这个 python 语句中调用了 Numpy 的 C 实现中的哪些函数:
y = np.exp(x)
您可以使用第一个答案提供的 gdb python 脚本在 Numpy 实现的所有函数上设置断点: Can gdb set break at every function inside a directory?
通过 source somename.py
加载此 python 脚本后,您可以在 gdb 中运行此命令:rbreak-dir numpy/core/src
并且你可以为每个断点设置命令:
commands 1-5004
> silent
> bt 1
> c
> end
(这里1-5004是你要运行命令的断点范围)
一旦激活断点,该命令将运行并打印第一层回溯(这是您所在的当前函数的信息),然后继续。通过这种方式,您可以跟踪 Numpy 中的所有功能,这是我自己工作环境的照片(我拍了一张快照,因为有规则阻止从工作计算机复制任何字节):
希望我的尝试能帮助到后来者。
最佳答案
However, what I really want to know is: how could I track the calling chain from python code to C implementation? Or i.e. how could I know which part of its C implementation corresponds to this simple numpy array addition?
据我所知,主要有两种方法:使用调试器或跟踪代码中的函数(通常通过查看包装部分或在 numpy/core/src/XXX/
)。 Numpy 有不同种类的函数。有些更关注 CPython 交互部分(例如类型检查、数组创建、通用迭代器等),有些则专注于计算部分(高效地进行计算)。关于你想要什么,需要检查不同的文件。
core/src/umath/loops.c.src
是执行基本独立数学运算的核心计算函数的方法。
Can I use some tools like gdb to track its stack frame step by step?
除非您熟悉 Numpy 的代码,否则使用调试器是常用的方法。您可以尝试通过查看包装器代码来找到 Numpy 入口点函数,但我认为这有点困难,因为这部分代码的可读性不是很好(生成许多相关部分当然是为了便于开发避免错误)。 GDB 的困难部分是在 Numpy 中找到函数的第一个入口点(CPython 解释器函数调用很难跟踪,因为它们很多(有时被递归调用)并且调用堆栈很大,远非清晰(即。没有关于正在执行的实际语句/表达式的明确信息。也就是说,AFAIR,入口点通常类似于 PyArray_XXX
或 array_XXX
。你可以还跟踪了 Numpy 库的第一个函数执行代码。
Or can I directly recognize the corresponding codes from variable naming policy?
一些函数有一个标准化的名称,例如 PyArray_XXX
。也就是说,核心计算功能通常没有。它们有一个由模板系统生成的名称,该系统解析注释和注释并基于此生成代码。两个数组相加,主要计算函数应该是例如@TYPE@_add@isa@
其中 @TYPE@
是关于您的目标平台的 INT
或 LONG
。有一个用于 float 的特殊版本(即特化),它使用优化的成对求和以确保准确性。这种命名约定非常频繁,因此您可以在代码中搜索 _add
或 begin repeat
部分 with add
作为 种类
参数。
相关帖子:Numpy argmax source
关于python - 如何跟踪从 numpy 到 C 实现的 "calling chain"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73578142/
为什么下面的工作: from itertools import chain 但下面的不是吗? import itertools.chain as chain 最佳答案 import foo.bar 语
1、逻辑流 在屏幕开发中,存在如下逻辑流: PBO(Process Before Output):屏幕输出之前触发 PAI(Process After Input):用户在屏幕中执
我正在尝试链接一系列任务,返回一个 promise ,在链的最后执行并行执行。下面的代码不起作用,我认为你可以传递任何在“then”内返回 promise 的对象。有没有适当的方法来实现这一点。谢谢。
您能否对 itertools 中的 chain() 和 chain.from_iterable 这两个方法给出更简单的解释? 我搜索了知识库和 python 文档,但我很困惑。 我是 python 新
问题的简短版本 我就是否使用 ./*this 与 ->/this 寻求建议,即 C++ (*this).chained().methods() 与 this->chained()->methods()
itertools 中所有有趣的迭代器让我着迷,但我的一个困惑是这两个函数之间的区别以及为什么存在 chain.from_iterable。 from itertools import chain d
Swift 中的“可选链接”和“可选调用链接”之间有语义差异吗? 最佳答案 我暂时会回答“否”,没有语义差异。 “Optional Chaining”在“Swift 编程语言(Swift 2 Prer
我有一个服务器和一个客户端。我让他们都在同一台机器上运行。我正在尝试在客户端和服务器之间建立 SSL 连接。我已经使用以下 keytool 命令为服务器和客户端生成了证书。 对于客户keytool -
我有一些数据要从带有 lodash 的 json 数组中拒绝。我需要拒绝不需要的多个键值。 我在想我可以链接映射并再次使用 reject 函数,或者可能为 reject 方法编写一个谓词函数以供使用。
我真的什么都试过了。令人惊讶的是,谷歌对此没有太多答案。 当某个 .csv 文件上传到 S3 存储桶时,我想解析它并将数据放入 RDS 数据库。 我的目标是学习 lambda serverless 技
我最近一直在研究区 block 链,并偶然发现了以太坊和 chain.com 这两个平台似乎都有助于开发和部署区 block 链应用程序,其中 chain.com 专门针对金融公司。 尽管如此,两者之
asyncFunction1 .then(asyncFunction2, errorHandlerFunction) .then(Function3, errorHandlerFunc
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我得到 RqlRuntimeError: Expected type TABLE_SLICE but found SELECTION: 链接 getAll 和 between 方法时出现错误。 r.d
我对 jquery ui 很陌生,但由于我的项目的性质,我有点陷入了困境!基本上我需要帮助的是,我有一个文件,该文件将某些自定义设置应用于 jquery ui 可拖动小部件,并且我想进一步自定义以启用
我有一个函数应该一个接一个地运行,例如: function cutTomatoesAlone(Kg){ // slice my stuff } function cookTomatoes(Mi
Android 新手,我想制作一些流畅的动画。 我在设备上有一个包含效果的文件,每个效果都是一个动画。该文件告诉我何时播放效果以及效果持续时间。 问题是我不能动态链接 animatorSet : An
我有一个 Action,叫做 ShowData从数据库中恢复数据并将其放入 jsp。 struts.xml ... foo.jsp ... 在 foo.jsp 页面中,我有一个表单和我使用
我正在尝试使用三元运算符编写类似这样的东西(由于 jsx 语法限制而需要) if(!this.state.msg) { if(this.state.ask.length != 0) {
这段代码有区别吗? var query = DbContext.Customers .Where() .Include("Address
我是一名优秀的程序员,十分优秀!