我想找出某些类和函数在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也不起作用。
请帮助我了解这里的问题是什么,更重要的是,我如何才能找到这些定义。
发布于 2021-04-14 08:49:23
这实际上很复杂。Pytorch/libtorch是一个庞大的项目,它依赖于许多已经在C/Cuda中实现的内置底层函数。大多数低级内核(例如数学运算)甚至有几个实现,以便针对CPU和GPU等进行不同的优化。因此,这个库中有很多不是python代码的东西,inspect
将会有一段艰难的时间。
如果您想找到源文件,您可能需要自己深入研究github repository,并充分利用grep
和find
等工具。然而,torch.nn
模块几乎完全是python,所以我认为inspect
可以正确地使用它的特性(如数据集、数据加载器、模块、优化器等)。
最后,如果您需要的话,下面是python的文件,您可以在其中找到混合了对C api的调用的torch.tensor
代码:torch tensor source code
关于下面评论中的问题:
我不能提供一个完整的答案,因为这超出了我对python和C++代码在torch中是如何接口的理解。但我会尽我所能(如果有人对此有任何更正或改进,请一定要做)。
C源代码和python代码之间有一个根本的区别: C/C++是编译的,因此在这些语言中实现的特性是编译后的汇编代码。换句话说,当python代码从底层C代码调用函数/对象时,它会调用人类不再可读的汇编函数。因此,计算机可以进行调用,但是查找源代码(供您阅读)的inspect
功能无法工作,因为这些代码不再存在(至少不是inspect
正在查找的地方)。您还需要其他专门分析汇编指令的工具,如反汇编程序、调试器等(如果您足够勇敢,还可以学习x86-64汇编语言编程)。
https://stackoverflow.com/questions/67077747
复制相似问题