PyTorch版本:1.10.0

Tensor

Tensor是Pytorch项目较为重要的一部分,其中的主要功能如存储,运算由C++和CUDA实现,本文主要从前端开始探索学习Tensor的代码结构。

结构探索

PyTorch前端位于torch目录下,从_tensor.py可以找到Tensor的python定义,可以看到其继承自torch._C._Tensorbase

而Tensorbase的定义可以从torch/_C目录下的__init__.pyi.in文件中找到

可以看到这里传入了metaclass的参数,同时注释表明_TensorBase 和 _TensorMeta的定义存在于python_variable.cpp中

学习一下metaclass相关知识。参考来源于 https://blog.csdn.net/jiguanglong/article/details/93204314

Python除了部分特殊符号之外都是对象,类同样是对象,为了便于理解,可以认为它们相比普通对象,多了可以被实例化的特点。

所有的对象应该拥有基本属性__class__(属于什么类),而所有的类在此基础上应该拥有另一个基本属性__bases__(父类)。如果进行实验可以发现:
一直通过__class__追溯上去,type是最终的顶点(type的__class__指向自己);
一直通过__bases__追溯上去,object是最终的顶点(object的__bases__为空)。 因此可以称type为元类(一般类的类),当我们进行类定义的时候,实际上运行的是class = type(classname, superclasses, attributedict) (也就是type的__call__方法) 而如果传递了metaclass参数,此时类创建的动作就不再由type执行,而是执行参数对象的__call__方法。 有什么用:通过这种改变元类的方法,我们可以在类创建的过程中增加自定义的工作,该特性极大地提高了编程的自由度。

进一步,在torch/csrc/autograd/python_variable.cpp 中可以找到上面Base与Meta类的定义来源

1509与1518行分别对这两个类的定义和文件中的C++对象进行了绑定(module在这里是pytorch前端的_C),进而找到

因此表面上的结构可以表示成如下

PyTorch项目源码学习(2)——Tensor代码结构初步学习的更多相关文章

  1. [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构

    [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 目录 [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x0 ...

  2. Zepto源码分析之一(代码结构及初始化)

    关于读源码,读jQuery自然是不错,但太过于庞大不易解读,对于小白,最好从Zepto,Lodash这样的小库入手. 这里使用的是zepto1.1.6版本为例. 自执行函数 在阅读之前,先弄清楚闭包和 ...

  3. Java项目源码为什么要做代码混淆(解释的很好)

    代码混淆,是将计算机程序的代码转换成一种功能上等价,但是难于阅读和理解的形式的行为.代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码.执行代码混淆的程序被称作代码混淆器.目前已经存在许多种 ...

  4. 对于学习apache软件基金会顶级项目源码的一点思路(转)

    ASF的开源项目,为软件行业贡献了太多好的产品和软件思维.学习ASF的项目源码能很大的提升自身的能力.程序运行在服务器上的流程:执行启动脚本(start.sh) -> 指向程序的主方法 -> ...

  5. MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

    先来张在路上…… 铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroad_lee/MongoDBDemo.rar 此项目是用Maven创建的,没有使用Mave ...

  6. 用Assert(断言)封装异常,让代码更优雅(附项目源码)

    有关Assert断言大家并不陌生,我们在做单元测试的时候,看业务事务复合预期,我们可以通过断言来校验,断言常用的方法如下: public class Assert { /** * 结果 = 预期 则正 ...

  7. 最新app源码下载:200款优秀Android项目源码

    200款优秀Android项目源码!菜鸟必备!Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他 ...

  8. 反射实体自动生成EasyUi DataGrid模板 第二版--附项目源码

    之前写过一篇文章,地址 http://www.cnblogs.com/Bond/p/3469798.html   大概说了下怎么通过反射来自动生成对应EasyUi datagrid的模板,然后贴了很多 ...

  9. WeMall微信商城源码活动报名插件代码详情

    WeMall微信商城源码插件活动报名代码是用于商业推广的比较有效的方式,分享了部分比较重要的代码,供技术员学习参考,商家可自由设置报名项目,活动时间,报名内容 代码详情地址:http://addon. ...

  10. Java源码阅读的真实体会(一种学习思路)

    Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈 ...

随机推荐

  1. FreeSWITCH添加h264编码及pcap视频提取

    操作系统 :CentOS 7.6_x64.Windows 10_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.2 一.启用h264相关模块 这里以 mod_openh26 ...

  2. MySQL8.0默认加密连接方式

    Mysql8.0开始默认采用新的caching_sha2_password的身份验证方式,常规老接口会因此无法连接数据库. 为继续使用老的身份验证方式,需显式指定身份验证方式为 mysql_nativ ...

  3. MySQL误删恢复方法2

    实际工作中总会发生数据误删除的场景,在没有备份情况下,如何快速恢复误删数据就显得非常重要. 本文基于MySQL的binlog日志机制,当日志格式设置为"binlog_format=ROW&q ...

  4. 将GitBash设置为VS Code的默认终端

    这个东西搞了半天,真的无语...网上的东西都太旧了 注意:"terminal.integrated.shell.windows"自2021年4月起已弃用. 1.首先打开设置 2.进 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (110)-- 算法导论10.2 1题

    一.用go语言,单链表上的动态集合操作 INSERT 能否在 O(1)时间内实现?DELETE 操作呢? 文心一言: 在单链表中,INSERT 和 DELETE 操作的时间复杂度通常是 O(n),其中 ...

  6. Centos7下创建centos-home逻辑分区

    1备份要挂载的文件夹 查看home文件夹有无文件,如有文件一定要记得备份 2创建逻辑分区 2.1查看已有逻辑分区 2.2查看磁盘分区情况 2.3查看磁盘PV 2.4创建逻辑分区 lvcreate -n ...

  7. SqlServer的执行计划如何分析?

    sqlserver的执行计划 执行计划是 SQL Server 中的一个重要工具,用于分析和优化查询的性能.它提供了关于查询的详细信息,包括查询的执行顺序.使用的索引.连接类型.过滤条件等. What ...

  8. Java进程(基础)

    基本概念 1.进程:程序的执行过程 2.线程:一个进程可以有单个线程也就是我们说的单线程,还可以有多个线程也就是我们说的多线程, 线程 1.当一个类继承了Thread类就可以当成一个线程用 2.我们会 ...

  9. ASP.NET CORE MVC的一些说明

    1.ASP.NET CORE MVC 是微软公司的Web应用开发框架,结合了MVC架构的高效.简洁等优秀思想并融合了.NET的灵活性. 2.ASP.NET诞生于2002年,当时微软想保持桌面应用程序的 ...

  10. 【本博客所有关于git文章迭代汇总】git操作(暂存,回退,绑定远程等),看这一篇就够了

    1.git常用操作 git 小白操作,无非是clone,然后拉取,提交分支,第一次clone的时候,关联远程分支可能会遇到问题,可以看第四条git关联远程分支 # 在当前目录新建一个Git代码库 $ ...