我已经阅读了tutorial and API guide of Numpy,并从这个有用的文档中学习了如何用我自己的C代码扩展Numpy,或者如何使用C来调用Numpy函数.

然而,我真正想知道的是:我如何跟踪从python代码到C实现的调用链?或者,我如何知道它的C implementation的哪个部分对应于这个简单的数字数组加法?

x = np.array([1, 2, 3])
y = np.array([1, 2, 3])
print(x + y)

我可以使用像gdb这样的工具来逐步跟踪它的堆栈框架吗?

或者我可以直接从变量命名策略中识别相应的代码吗?(例如,如果我想知道关于加法的代码,我可以搜索类似函数PyNumpyArrayAdd(...)的代码)

推荐答案

然而,我真正想知道的是:我如何跟踪从python代码到C实现的调用链?或者,我怎么知道它的C实现的哪一部分对应于这个简单的数字数组加法呢?

有两种主要的方法可以做到这一点:使用调试器或通过跟踪代码中的函数(通常通过查看包装部分或通过在numpy/core/src/XXX/中搜索关键字).Numpy有不同的功能.一些人更多地关注CPython交互部分(例如,类型判断、数组创建、泛型迭代器等),还有一些专注于计算部分(高效地进行计算).关于您想要的,需要判断不同的文件.core/src/umath/loops.c.src是进行基本独立数学运算的核心计算功能的最佳 Select .

我可以使用像gdb这样的工具来逐步跟踪它的堆栈框架吗?

除非您熟悉Numpy的代码,否则使用调试器是常见的方法.您可以try 通过查看包装器代码来找到Numpy入口点函数,但我认为这有点困难,因为这部分代码的可读性不是很好(许多相关部分的生成肯定是为了简化开发,避免错误).GDB最难的部分是在Numpy中找到函数的第一个入口点(CPython解释器函数调用很难跟踪,因为它们很多(有时是递归调用的),而且调用堆栈非常大,远远不清楚(即.没有关于正在执行的实际语句/表达式的明确信息).话虽如此,公平地说,入门点通常是PyArray_XXXarray_XXX左右.您还可以跟踪Numpy库的第一个函数执行代码.

或者可以直接从变量命名策略中识别对应的编码?

一些函数有一个标准化的名称,如通常的PyArray_XXX.也就是说,核心计算功能通常不会.它们有一个由模板系统生成的名称,该模板系统解析注释和注释并基于此生成代码.对于添加两个数组,主计算函数应该是例如@TYPE@_add@isa@,其中@TYPE@是关于目标平台的INTLONG.有一个特殊的版本(即专门化)用于浮点数,它使用优化的成对求和,以保证准确性.不过,这种命名约定非常常见,因此您可以在代码中搜索_add,也可以搜索包含add作为kind参数的begin repeat部分.


相关帖子:Numpy argmax source

Python相关问答推荐

如何在Python中使用ijson解析SON期间检索文件位置?

Python plt.text中重叠,包adjust_text不起作用,如何修复?

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

Python多处理:当我在一个巨大的pandas数据框架上启动许多进程时,程序就会陷入困境

根据不同列的值在收件箱中移动数据

将输入管道传输到正在运行的Python脚本中

Vectorize多个头寸的止盈/止盈回溯测试pythonpandas

如何让Flask 中的请求标签发挥作用

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

在Django admin中自动完成相关字段筛选

索引到 torch 张量,沿轴具有可变长度索引

无法连接到Keycloat服务器

为什么\b在这个正则表达式中不解释为反斜杠

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

跳过嵌套JSON中的级别并转换为Pandas Rame

从列表中获取n个元素,其中list [i][0]== value''

使用Python异步地持久跟踪用户输入

在极点中读取、扫描和接收有什么不同?

jsonschema日期格式

在Django中重命名我的表后,旧表中的项目不会被移动或删除