程序员修炼之道-书摘(二)
并发 并发性指的是两个或更多个代码在执行过程中表现得像是在同时运行一样,并行性是指它们的确是在同一时刻一起运行 打破时域耦合 时域耦合指的是时间,时间对我们来说有两个重要的方面:并发性(在同一时刻发生的多件事情)以及次序(事情在时间轴上的相对位置) 搜寻并发性,通过分析工作流来提高并发性 并发性是一种软件机制,而并行性则和硬件相关 共享状态是不正确的状态 非原子更新 信号量和其他形式的互斥 信号量是一个在同一时间只能让一个人持有的东西,你可以创建一个信号量,然后利用它来控制对其他资源的访问 让资源具备事务性;多个资源的事务 随机故障通常是并发问题 角色与进程 定义 角色是一个独立的虚拟处理单元,具有自己的本地(且私有的)状态,每个角色都有一个信箱。当消息出现在信箱中切角色处于空闲状态时,角色被激活并开始处理消息,处理完该条消息后,它将继续处理信箱中的其他消息,如果为空,则返回休眠状态。 进程通常代表一种更通用的虚拟处理机,它一般由操作系统实现,可以让并发处理更容易,进程也能(根据约定)被约束为角色的形式运转 角色只会是并发的 没有一件事是可控的 系统中唯 ...
程序员修炼之道-书摘(一)
我们,采集的只是石头,却必须始终展望着未来的大教堂 务实的哲学 人生是你自己的,是你在拥有、经营和创造。 提供选择,别找借口。如果磁盘挂起,你所有的源码都在里面–而你没有备份,这就是你的错,跟老板说“我的源码被猫吃了”解决不了问题 不要搁置“破窗”(糟糕的设计、错误的决定、低劣的代码)不去修理。每发现一个赶紧修一个。一定要告诉自己“不要打破窗户” 找出合理的请求,然后不断完善,一旦有成果产出,展示给人们看,让他们大吃一惊。 够好即可得软件就是最好的。让用户参与权衡,如果你早点给用户一点东西玩,他们的反馈常常能引领你做出更好的最终方案。 目标: 每年学习一门新语言,不同的语言以不同 的方式解决相同的问题,拓宽思维,避免陷入陈规 每月读一本技术书,扩展领域,学习一些和项目不相关的东西 还要读非技术书 上课,本地大学或网上有趣的课程 与时俱进 批判性思维,批判性地分析你读到的和听到的东西 问“五个为什么” 谁从中受益 有什么背景 什么时候在哪里可以工作起来 为什么这是个问题 交流,缺乏有效的交流,好点子就成了一个孤儿。 传递信息的过程才算是交流,为了把信息送达,你需要了解 ...
PyTorch学习笔记
张量简介和创建 Tensor概念 张量是什么?是一个多维数组,它是标量、向量、矩阵的高维拓展。 Tensor与Variable Variable是torch.autograd种的数据类型,主要用于封装Tensor,进行自动求导,具有5个属性: data:被包装的Tensor grad:data的梯度 grad_fn:创建Tensor的Function,是自动求导的关键 requires_grad:指示是否需要梯度 is_leaf:指示是否是叶子结点(张量) PyTorch 0.4.0版开始,Varibable并入Tensor,Tensor具有8个属性,除了上面5个还有: dtype:张量的数据类型,如torch.FloatTensor,torch.cuda.FloatTensor shape:张量的形状,如(64,3,224,224) device:张量所在设备,GPU/CPU,是加速的关键 张量的创建 直接创建 torch.tensor()从data创建tensor data:数据,可以是list,numpy dtype:数据类型,默认与data的一致 ...
机器学习笔记--神经网络
神经网络表述 模型表示 大脑中每一个神经元可以认为是一个处理单元/神经核,它含有许多输入/树突,并且有一个输出/轴突。神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络。 神经网络模型建立在很多神经元之上,神经元(也叫激活单元(activation unit)采纳一些特征作为输出,根据本身的模型提供一个输出。参数被称为权重(weight)。 一个神经网络结构如图所示: 上面是一个 3 层的神经网络,第一次为输入层(Input Layer),最后一层为输出层(Output Layer),中间一层为隐藏层(Hidden Layers),我们为每一层都增加一个偏差单位(bias unit)。每个神经元都对它的输入和权重进行点积,然后加上偏差,最后使用非线性函数(或称为激活函数)。 下面引入一些标记法来帮助描述模型: ai(j)a_i^{(j)}ai(j) 代表第jjj 层的第 iii 个激活单元。θ(j)\theta^{(j)}θ(j)代表从第 jjj 层映射到第j+1j+1j+1 层时的权重的矩阵,例如θ(1)\theta^{(1)}θ(1)代表从第一层映射到第二层的权重的 ...
机器学习笔记--线性回归和逻辑回归
介绍机器学习 定义 机器学习的定义:一个程序被认为能从经验E中学习,解决任务T,达到性能度量值P,当且仅当,有了经验E后,经过P评判,程序在处理T时的性能有所提升。(Tom Mitchell ,卡内基梅隆大学) 分类 监督学习:通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出,例如回归和分类 非监督学习:直接对输入数据集进行建模,例如聚类 半监督学习:综合利用类标的数据和没有类标的数据,来生成合适的分类函数。 线性回归 代价函数(cost Function) 房价预测问题: mmm 代表训练集中实例的数量 xxx 代表特征/输入变量 yyy 代表目标变量/输出变量 (x,y)\left( x,y \right)(x,y) 代表训练集中的实例 (x(i),y(i))(x^{(i)}, y^{(i)})(x(i),y(i)) 代表第iii 个观察实例 hhh 代表学习算法的解决方案或函数也称为假设(hypothesis) 一种可能的表达式:hθ(x)=θ0+θ1xh_{\theta }\left ( x \right ) = \theta ...
三种容器简单介绍 string vector map
string 介绍 标志库类型 类型 说明 string 字符 char* vector 动态数组 静态数组[] map key/value 内部以树的形式存储 O(log2N) 哈希表 O(1) string 介绍 string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 typedef basic_string<char> string; 模板类 typedef basic_string<wchar_t wstring; 模板类 要使用 string 类型对象,必须包含相关头文件 #include<string> using std::string string 对象的定义和初始化 string s1; // 默认构造函数,s1 为空串 steing s2(s1) // 将 s2 初始化为 s1 的一个副本 string s3("value"); // 将 s3 初始化为一个字符串字面值副本 string s4(n,'c'); / ...
友元与运算符重载
友元 友元介绍 友元是一种允许非类成员函数访问类的非公有成员的一种机制 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元 友元函数 友元类 友元函数 友元函数在类的作用域外定义,但它需要在类体中进行说明; 为了与该类的成员函数加以区别,定义的方式是在类中用关键字 friend 说明该函数,格式如下: friend 类型 友元函数名(参数表); 友元的作用在于提高程序的运行效率。 友元函数虽然不是类的成员函数,但是可以访问类的私有的,公有的,保护的成员对象。 友元函数注意事项 友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符‘.'加对象成员名。但友元函数可以访问类中的所有成员(公有的,私有的,保护的),一般函数只能访问类中的公有成员。 友元函数不受类中的访问权限关键字限制,可以把它放在类的公有,私有,保护部分,结果一样; 某类的友元函数的作用域并非该类的作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。 友元函数破坏了面向对象程序设计类的封装性,所以友元函数如果不是必须使用,则尽量少用 ...
对象的使用
对象的使用(一) static 成员 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量,比如说统计某种类型对象已创建的数量; 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时候我们可以用类的静态成员来解决这个问题; 非 static 数据成员存在于类类型的每个对象中,static 数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。与所有的类对象是共享的 class CountedObject{public: CountedObject(); ~CountedObject(); static int count_; //静态成员的引用性声明,还需要有定义性的说明};int CountedObject::count_ = 100; // 静态成员的定义性声明,不需要 static 关键字 ,初始化为 100,默认初始化为 0 // 在 .c 文件中 static 成员的优点 static 成员的名字是在类的作用域中,因此可以避免与其他类成员或全局对象名字冲突; ...
构造函数与析构函数
构造函数与析构函数(一) 构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 构造函数如何定义的? 函数名和类名完全相同 不能定义构造函数的类型(返回类型),也不能使用 void 通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显示调用 构造函数被声明为私有有特殊的用途 构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数(重载) 默认构造函数 不带参数的构造参数称为默认构造函数 如果程序中未声明,则系统自动产生出一个默认构造函数 构造函数是可以被重载的 class Test{public: //如果类不提供任何一个构造函数,系统将为我们提供一个不带参数的默认构造函数 Test(); Test(int num); void Display();private: int num_;};Test::Test(){ num_ = 0; cout << "Initialliz ...
面向对象介绍
面向对象介绍 介绍 结构化程序设计 pascal之父 结构化程序设计先驱 迪杰斯特拉 程序 = 算法 + 数据结构 程序是完成一定功能的一系列有序指令的集合 这种设计方法是面向过程的,特点是数据与数据处理分离 结构化程序设计是自顶向下,将系统视为分层的子程序的集合,可以将程序分为功能不同的模块,使得整个程序更有条理性,但是很多数据仍然属于整个程序,因而结构化程序设计思想还是需要有很多的全局变量,在某个地方进行更改,所以会对整个程序产生难以预料的影响。 结构化程序设计的缺陷,其根源在于数据与数据处理的分离 程序难以管理 数据修改存在问题 程序可重用性差 用户要求难以在系统分析阶段准确定义,致使系统在交付使用时产生许多问题 用系统开发每个阶段的成果来进行控制,不能适应事物变化的要求 面向对象程序设计 面向将系统看成通过交互作用来完成特定功能的对象的集合,每个对象用自己的方法来管理数据也就是说只有对象内部的代码能够操作对象内部的数据 程序 = 对象 + 对象 + 对象 + 发生消息 对象 = 算法 + 数据 三个特性: 封装 继承 多态 面向对象程序设计 ...