最近开始看一些大工程量的python代码,作为深度学习小白,每次看着那么多份文件、遇到几千行代码就很头疼,无从下手。而且经常会遇到看了后边忘前面、看不下去等问题。
  搜了一些博客和知乎,看到了大神们提出的阅读代码的方法,就想着整理一下,可帮助自己梳理代码逻辑和进阶写代码。最近也有在实践,感觉比硬着头皮看要好多了,希望以后能更加熟练!
  以下只涉及阅读学习的一些方法。当然,想要掌握得更好,光阅读是不够的,一定要动手写、训练模型!!!调参、调bug的过程也是吸收的过程。(就像高中做题一样)


  首先,想要解决一个问题,最先要分析出现问题的原因

影响阅读速度可能的原因

  • 对整体的思路没有概念
  • 不熟悉常用的类库、函数,包括方法调用不熟悉
  • 不熟悉python常用的编程技巧
  • 不理解里面的一些算法
  • 中途停顿时间太长,接过来后没有形成一个系统的思路。

  接下来,就是具体的一些方法和技巧。

阅读方法

1.整体到局部

  • 把握整体。有个大体的框架在脑海中,此时根据里面的文件名和文件夹,从入口文件大段大段看就可以,知道这段或者这个文件的作用就可以。
  • 找到入口后,可以顺着入口来看每个函数的作用和意思;或者可以先看看核心模型部分的算法,标注每个类、函数的作用。

2.熟悉类库、编程模块

  • 首先,影响代码阅读的最核心的问题是对类库不熟悉会带来的问题:引起阅读时左右查资料,精力太分散,一句一句读,经常需要上网查语法,没有办法把精力放在代码的整体结构上,即使是每行代码都看明白了还是不知道整个程序的逻辑,同时耗费精力比较大,很快就累了,效率很低。
  • 整理学习。把不熟悉的类库全部整理出来,到官网查用法,一次性过一遍。注意,此时不用全部看,只需要查调用到的地方什么意思,弄明白调用的意思即可。
  • 略读,逻辑很重要。熟悉了常用库和编程技巧之后读代码的时候很多功能自己都实现过类似的,或者之前见过,扫一眼就看明白了,很多函数扫一眼就知道什么功能,思路不会被不懂得语法或者编程技巧打断,一直停留在程序的逻辑上,这样看代码就轻松多了,而且很快。
  • 总结建立自己的代码库。代码看的多了就会发现有些语句是非常常用的,而且已经形成套路了,在阅读的过程中可以将这些代码段总结下来,便于以后使用。

3.静心看算法,及时看论文

  • 遇到不熟悉的算法一定要提醒自己静下心来。
  • 如果有注释可以根据注释来理解。
  • 如果没有,一方面可以先跳过,继续了解整体,然后再细分了解这个算法;另一方面及时返回论文,去看模型的思路或实验中的一些细节等,论文相当于部分代码注释,而且还能帮助加深模型的理解。

4.连续性

  • 趁热打铁。最好不要今天看一点点,隔了非常长的时间再看其他部分。
  • 如果实在看不完就先把一个较完整的模块看完,有必要一定要做记录,方便明天再看。

5.好记性不如烂笔头-阅读代码的两种模式

这个部分参考了一位大神的回答:
https://www.zhihu.com/question/21186887/answer/18195570

  • top-down 模式:就是先设定一个 use case,比如说打开一个文件。然后静态跟着代码看,或者用 debugger 跟着看。每次出现函数调用的时候,把函数的执行层次纪录下来。把重要的「实际参数」一直标下来,这样阅读深层次代码不用再回头查形式参数到底指什么。大致如下:
f1( para1, para2, … )f2( para1, para2, …  )f4( para1, para2, … )f3( para1, para2, …  )
  • bottom-up 模式:top-down 模式进行到一定层次,往往会发现虽然图画了出来,但还是无法了解程序再干什么。这时需要转入 bottom-up 模式,一直深入到最底层,给能了解作用的底层函数一个一个的写文档。当然这时的文档是完全底层的观点。

一些心得体会

  • 将代码当作阅读理解来读!
    文章尚且是有逻辑的,代码也是。我们读文章的时候最重要的不是记住里面优美的句子,而是要能够理解作者所说(也就是文章的内涵、中心思想)。代码也是一样,将它看作优美的文章,想象着自己在探索一个真理、在读一个有趣的故事,这样看起来就不会太枯燥无味了。
  • 带着目标去读,往往效率高而且不容易困!
    如果只是消遣,那往往就是读完文章后总结一些内容就作罢。但是要想学习到文章中更深刻的内容,就需要另一种方式。给自己提问题,比如:这段代码什么作用、参数怎么调用的、代码整体逻辑是什么样的等等,这样在读代码的过程中就会有针对性地去学习,也比较容易能记住。

最后,最重要的,一定是动手去练、去写!

  • 可以对每一小步、每一个小语句或每一个代码块进行输出,看结果,来熟悉语句
  • 训练整体的模型

如何学习别人的代码(代码量较大时)相关推荐

  1. bootstrap 树形表格渲染慢_bootstrap-table-treegrid数据量较大时渲染太久了

    bootstrap-table-treegrid数据量较大时渲染太久了 森姐姐 2019-10-23 16:48:51 2260 收藏 2 分类专栏: 遇到的问题 最后发布:2019-10-23 16 ...

  2. 两组数据量相对大时,如何高效进行比对

    前言 前阵子项目因业务需要,要对接兄弟部门的用户数据,因为兄弟部门并不提供增量用户数据接口,每次只能从兄弟部门那边同步全量用户数据.全量的用户数据大概有几万条.因为是全量数据,因此我们这边要做数据比对 ...

  3. 数据量过大时数据库操作的处理

    一些大规模的系统,如人口系统的数据甚至超过了1000万条,可谓海量.那么,如何实现快速地从这些 超大容量的数据库中提取数据(查询).分析.统计以及提取数据后进行数据分页已成为各地系统管理员和数据库管理 ...

  4. 海量数据(数据量比较大时)的处理分析

    转载http://www.blogjava.net/lcs/archive/2008/02/18/180396.html 海量数据处理问题是一项艰巨而复杂的任务.原因有以下几个方面: 一.数据量过大, ...

  5. java 批量处理_Java模拟数据量过大时批量处理数据的两种实现方法

    方法一: 代码如下: import java.util.ArrayList; import java.util.List; /** * 模拟批量处理数据(一) * 当数据量过大过多导致超时等问题可以将 ...

  6. 第9条:用生成器表达式来改写数据量较大的列表推导式

    核心知识点: (1)当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题. (2)由生成器表达式所返回的迭代器,可以逐次产生输出值,从而避免内存用量问题. (3)把某个生成器表达式所返回的迭代 ...

  7. MyBatis中使用流式查询避免数据量过大导致OOM

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天mybatis查询数据库中大量的数据,程序抛出: java.lang.OutOfMemoryError: Java heap s ...

  8. for循环数据量太大_中文文本分类roberta大力出奇迹之数据量大的问题

    问题描述: 笔者在文本分类场景中使用了roberta+pool+dense的三分类模型.采用预训练模型做项目的时候经常苦于数据太少,模型泛化性差,因此收集了1300W数据.在我尝试暴力出奇迹的时候,遇 ...

  9. ETL学习总结(1)——ETL 十大功能特性详解

    前言 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行.说白了就是,很有必要去理解一般ETL工具必备的特性和功能,这样才更好的掌握Kettle的使 ...

最新文章

  1. 史上最全的Web性能测试工具大全(下 )
  2. 《数据库原理与应用》(第三版)第2章 数据模型与数据库结构 习题参考答案
  3. thinkphp 删除该表的最后一行
  4. Objective-C模版方法(TemplateMethod)
  5. java猜数游戏图形界面_Java做一个猜数的小游戏
  6. Spark streaming 概述
  7. Gopher一定要会的代码自动化检查
  8. 常用插件的封装(轮播图、选项卡、楼梯导航及、拖拽)
  9. ssh隧道(通过跳板机)连接mysql
  10. 24分钟让AI跑起飞车类游戏
  11. css面试题之Flex布局
  12. sql 分组 行列转换
  13. python积木编程软件_积木编程下载-积木编程app下载v1.0.0-西西软件下载
  14. 指纹识别登录Windows Server服务器远程桌面
  15. mysql数据库 头像字段_模仿陌陌八张头像的数据库,应该如何建表才合适?
  16. 网站密码明文传输解决方案js+java
  17. 前锋python入门到精通_武磊离顶级前锋到底有多远?Python实战分析告诉你
  18. SM9 用户私钥在线分发技术
  19. Cursor对象详解:
  20. 人力资源管理系统的演化

热门文章

  1. 【PADSVX2.7】PADSVX2.7
  2. 数组push后的返回值,容易忽略
  3. Stable DiffusionAI绘画一键启动整合包
  4. 计算机原理之定点与浮点表示教案,计算机组成原理-定点数和浮点数.ppt
  5. Centos:Xshell 修改Nginx配置文件
  6. WireGuard 安装
  7. springboot 集成quartz
  8. 1306 2249
  9. 不同平面直角坐标系之间的坐标转换公式
  10. MATLAB解算坐标转换7参数