然而,我真正想知道的是:我如何跟踪从python代码到C实现的调用链?或者,我怎么知道它的C实现的哪一部分对应于这个简单的数字数组加法呢?
有两种主要的方法可以做到这一点:使用调试器或通过跟踪代码中的函数(通常通过查看包装部分或通过在numpy/core/src/XXX/
中搜索关键字).Numpy有不同的功能.一些人更多地关注CPython交互部分(例如,类型判断、数组创建、泛型迭代器等),还有一些专注于计算部分(高效地进行计算).关于您想要的,需要判断不同的文件.core/src/umath/loops.c.src
是进行基本独立数学运算的核心计算功能的最佳 Select .
我可以使用像gdb这样的工具来逐步跟踪它的堆栈框架吗?
除非您熟悉Numpy的代码,否则使用调试器是常见的方法.您可以try 通过查看包装器代码来找到Numpy入口点函数,但我认为这有点困难,因为这部分代码的可读性不是很好(许多相关部分的生成肯定是为了简化开发,避免错误).GDB最难的部分是在Numpy中找到函数的第一个入口点(CPython解释器函数调用很难跟踪,因为它们很多(有时是递归调用的),而且调用堆栈非常大,远远不清楚(即.没有关于正在执行的实际语句/表达式的明确信息).话虽如此,公平地说,入门点通常是PyArray_XXX
或array_XXX
左右.您还可以跟踪Numpy库的第一个函数执行代码.
或者可以直接从变量命名策略中识别对应的编码?
一些函数有一个标准化的名称,如通常的PyArray_XXX
.也就是说,核心计算功能通常不会.它们有一个由模板系统生成的名称,该模板系统解析注释和注释并基于此生成代码.对于添加两个数组,主计算函数应该是例如@TYPE@_add@isa@
,其中@TYPE@
是关于目标平台的INT
或LONG
.有一个特殊的版本(即专门化)用于浮点数,它使用优化的成对求和,以保证准确性.不过,这种命名约定非常常见,因此您可以在代码中搜索_add
,也可以搜索包含add
作为kind
参数的begin repeat
部分.
相关帖子:Numpy argmax source