1.Python入门书籍推荐
2.Gevent源码剖析(二):Gevent 运行原理
3.源码剖析狗屁不通文章生成器
4.Pytorch源码剖析:nn.Module功能介绍及实现原理
5.pytorch 源码解读进阶版 - 当你 import torch 的源码时候,你都干了些什么?(施工中)
Python入门书籍推荐
来源:酷瓜书单
1. 《Python基础教程》 豆瓣评分:8
python最快的剖析入门是直接看 docs.python.org/tutorial/, 系统学习的源码话,这本书不错。剖析
2. 《Python学习手册》 豆瓣评分:8
非常全的源码一个工具书。建议先大致的剖析源码编辑器音乐画师看完,然后再根据实际使用去某个章节细读。源码
3. 《Python 3程序开发指南》 豆瓣评分:8
此书深入浅出,剖析适合python初学者学习。源码书中的剖析内容包含了进行python编程的所有知识,实例经典
4. 《Python源码剖析》 豆瓣评分:8
国内称得上“著”的源码书不多,这本书不但是剖析著,而是源码著得不错。
5. 《Python编程(第三版·英文影印版)》 豆瓣评分:8
大而全的剖析一本书,但是源码个人觉得它的选题很广,但是都不深入;虽然读起来很轻松,但是废话较多;还有就是GUI的篇幅太多,而我又基本不用GUI... 总体来说,和以前读Core Java的感觉比较接近,适合初学者循序渐进。xyq 源码
Gevent源码剖析(二):Gevent 运行原理
Gevent的运行原理在python2.7.5版本下,涉及多个关键概念。简单来说,它通过Greenlet类和Hub事件循环实现并发执行。以下是核心步骤:
首先,通过导入gevent模块,引入其初始化设置,greenlet的运行函数通过gevent.spawn()方法注册到Hub,这个过程包括获取Hub实例、初始化greenlet并保存函数和参数。get_hub()利用线程局部存储保证Hub的多线程一致性。
接着,greenlet通过g.start()注册到事件循环,回调事件由switch()控制,而不是直接运行函数,实现了协程的切换。Gevent提供了join()和joinall()两个入口,其中joinall()控制了整个流程。
在详细流程中,qpushbutton 源码iwait()函数扮演重要角色,通过创建Waiter对象,将协程的switch()链接到目标,通过waiter.get()控制协程执行和返回。Hub事件循环与运行协程通过waiter.get()和waiter.switch()协同工作,实现了并发执行。
目标协程的执行涉及事件循环的启动,通过Cython调用libev库执行。目标函数在run()中执行,并通过_report_result()和_report_error()处理结果或异常。"绿化"函数是实现并发的关键,它们允许在等待I/O操作时释放控制权,从而实现多任务并发。
总的来说,Gevent的运行涉及复杂的协程调度和事件驱动,虽然本文仅触及表面,但其背后的并发机制和技术细节更为丰富,包括异常处理和大量"绿化"函数的使用,这将在后续深入探讨。条码 源码
源码剖析狗屁不通文章生成器
一个名为“狗屁不通文章生成器”的项目在网络上引起了广泛关注,短短时间内就收获了.6千个星标和2.2千个分支。尽管项目只有6个文件,但其背后的黑科技却让其能够自动生成文章,引发了人们的好奇。
该项目起源于一个知乎问题,提问者需要写一份关于学生会退会的六千字申请。在众多的回答中,一位答主通过开源项目“狗屁不通文章生成器”迅速生成了一篇相关文章,不仅解决了提问者的困扰,还得到了广大网友的认同。文章内容虽然冗长且缺乏逻辑,但段段紧扣主题,引用了大量名人名言,使文章显得颇具说服力。
“狗屁不通文章生成器”最初是基于Python3的版本,后来有用户整理了网页版,并由suulnnka修改为在线版本,增强了页面样式,樱花源码使使用更加便捷。通过查询参数将生成主题输入,用户可以轻松获取文章。在源码分析中,我们可以发现生成文章的核心方法是将文章内容作为数组存储,数组中的每个元素代表一个章节,通过循环遍历数组生成文章。
作者通过在每个章节中随机添加名人名言、论述以及终止章节,以达到生成文章的效果。虽然这种方法简单有效,但也导致生成的文章内容重复度较高。为了解决这一问题,作者在项目中表示下一步计划将防止文章内容过于重复。此外,该项目还受到了网友的进一步开发,包括日语版和用于喷人内容的版本。
值得一提的是,项目中的代码大量使用了中文函数名和变量名,这种做法在编程中并不多见,展现了项目作者的独特风格。作者还特意修改了代码中遗漏的英文变量名,将其改为中文,进一步优化了代码的可读性。
总的来说,“狗屁不通文章生成器”通过简单的代码实现了文章的自动生成,满足了一定需求,但也存在内容重复度高的问题。该项目的开发和应用,展示了编程领域中创新与实用的结合,同时也引发了对于文本生成技术的深入思考。
Pytorch源码剖析:nn.Module功能介绍及实现原理
nn.Module作为Pytorch的核心类,是构建模型的基础。它提供了一系列功能,包括记录模型的参数,实现网络的前向传播,加载和保存模型数据,以及进行设备和数据类型转换等。这些功能在模型的训练和应用中起到关键作用。
在训练与评估模式间切换,模块的行为会有所不同,如rrelu、dropout、batchnorm等操作在两种模式下表现不同。可学习的参数,如权重和偏置,需要通过梯度下降进行更新。非学习参数,比如batchnorm的running_mean,是训练过程中的统计结果。_buffers包含的Tensor不作为模型的一部分保存。
模块内部包含一系列钩子(hook)函数,用于在特定的前向传播或反向传播阶段执行自定义操作。子模块列表用于存储模型中的所有子模块。
魔术函数__init__在声明对象时自动调用,优化性能的关键在于使用super().__setattr__而非直接赋值。super调用父类的方法,避免不必要的检查,提高效率。使用register_buffer为模块注册可变的中间结果,例如BatchNorm的running_mean。register_parameter用于注册需要梯度下降更新的参数。
递归应用函数用于对模型进行操作,如参数初始化。可以将模型移动到指定设备,转换数据类型,以及注册钩子函数以实现对网络的扩展和修改。
调用魔术方法__call__执行前向传播。nn.Module未实现forward函数,子类需要提供此方法的具体实现。对于线性层等,forward函数定义了特定的运算流程。从检查点加载参数时,模块自动处理兼容性问题,确保模型结构与参数值的兼容。
模块的__setattr__方法被重写,以区别对待Parameter、Module和Buffer。当尝试设置这些特定类型的属性时,执行注册或更新操作。其他属性的设置遵循标准的Python行为。
模块的save方法用于保存模型参数和状态,确保模型结构和参数值在不同设备间转移时的一致性。改变训练状态(如将模型切换到训练或评估模式)是模块管理过程的重要组成部分。
pytorch 源码解读进阶版 - 当你 import torch 的时候,你都干了些什么?(施工中)
使用PyTorch,无论是训练还是预测,你首先编写的代码通常如下所示:
依据Python代码的编写规则,导入逻辑将去相应的PyTorch site-package目录寻找__init__.py文件,具体路径为:${ python_path}/lib/python3.8/site-packages/torch/__init__.py
本章节聚焦于__init__.py 这个Python文件,从这里开始深入剖析,探究在一行简单的`import torch`命令背后,PyTorch是如何完成关键基础设置的初始化。
重点一:从`from torch._C import *`开始
在__init__.py 中,首先跳过一些系统环境的检查和判断逻辑,核心代码段为`from torch._C import *`,具体位置如下(github.com/pytorch/pytorch...):
这代表了典型的C++共享库初始化过程,遵循CPython代码组织规则,`torch._C`模块对应一个名为PyInit__C的函数。在文件torch/csrc/stub.c中,找到了此函数的相关定义(github.com/pytorch/pytorch...)。
initModule被视为PyTorch初始化过程中的第一层调用栈,深入探讨此函数中的关键内容。