在 PyTorch 中查找函数/类定义

问题描述

我想找出某些类和函数在 PyTorch(和其他库)中的定义位置。

很遗憾,以下方法不起作用:

import inspect
import torch

inspect.getsource(torch.tensor)

它抛出以下错误

TypeError: module,class,method,function,traceback,frame,or code object was expected,got builtin_function_or_method

此外,在 PyCharm 中,我通常使用 'gd'(在 vim 模式下)来查找函数/类定义,但这对 PyTorch 也不起作用。

请帮助我理解这里的问题是什么,更重要的是,我一般如何找到这些定义。

解决方法

这实际上很复杂。 Pytorch/libtorch 是一个庞大的项目,它依赖于许多已在 C/Cuda 中实现的内置低级函数。大多数低级内核(例如数学运算)甚至有几种实现,以便针对 CPU 和 GPU 等进行不同的优化。 所以这个库中有很多不是 python 代码的,inspect 会遇到困难。

如果您想找到源文件,您可能需要自己深入了解 github repository,并充分利用 grepfind 等工具。 但是,torch.nn 模块几乎完全是 Python,因此我认为 inspect 可以正确处理其功能(如数据集、数据加载器、模块、优化器等)

最后,如果您需要,这里是 torch.tensor 的文件,您会在其中找到与调用 C api 混合的 Python 代码:torch tensor source code

关于下面评论中的问题:

我无法提供完整的答案,因为这超出了我对 Python 和 C++ 代码在 Torch 中的接口的理解。但我会尽我所能(如果有人对此有任何更正或改进,请执行)。

C 源代码和 python 代码之间存在根本区别:C/C++ 是编译的,因此在这些语言中实现的功能作为编译后的汇编代码提供。换句话说,当您的 Python 代码从底层 C 代码调用函数/对象时,它会调用不再是人类可读的汇编函数。因此计算机可以进行调用,但是查找源代码(供您阅读)的 inspect 功能无法工作,因为此代码不再存在(至少不在 inspect 查找的位置) .您将需要其他工具,例如反汇编器、调试器等,专门用于分析汇编指令(如果您足够勇敢,还可以学习 x86-64 汇编语言编程:D)