迭代计算

高性能编程论述

…衆ロ難τιáo~ 提交于 2019-12-13 09:57:42
高性能编程 前言 首先说一下我为什么要写这篇博客。因为面试有提到这个,我当时直接说不懂(一方面当时心态很差,另一方面面试官的询问方式令我很反感。所以直接refuse了。小伙伴们千万别学我)。 所以,打算谈一谈我对Java高性能编程方面的认识与总结。 首先,高性能编程不涉及架构层次。所以打算通过这篇文章,来了解架构提升系统性能的小伙伴要失望了。我将Java高性能编程主要分为编码与网络两个部分(说白了,只关注编码,不提其它)。 其次,我们需要了解何为高性能。性能往往与系统的吞吐量,响应时间,并发量等息息相关。只有了解到这点,我们才可以对症下药。 网络部分:BIO,NIO,Netty等,这部分在之前的《 从BIO到Netty的演变 》有所提及,这里不再赘述。 而编码部分,也是最多人关注的部分。我将它按层次分为: 数据结构(如String,StringBuffer,StringBuilder) 语言特性(如for循环的JIT优化,并行流等) 算法(如分治算法,贪心算法等) 设计模式(如原型模式) 多线程(包括线程池,锁等) 扩展-特定机制(其实就是一些成熟的方案) 并发容器被归类到多线程中,而Fork/Join框架被归类到特定机制(当然,也可以归类到算法,多线程等。取决于看待它的角度)。 由于这其中每个分支,拆分出来都是很大的一块内容。所以这篇文章的目标只是给个方向而已,不会写得非常深入。

python(三)高级特性切片迭代等

拟墨画扇 提交于 2019-12-11 21:03:51
切片:取一个list或tuple的部分元素是非常常见的操作 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] ##取前3个元素 L[0:3]=['Michael', 'Sarah', 'Tracy'] ##或 L=[:3] ##N个元素,也就是索引为0-(N-1)的元素 ## 可以从索引1开始,取出2个元素出来: >>> L[1:3] ['Sarah', 'Tracy'] ##L[-1]取倒数第一个元素,那么它同样支持倒数切片,倒数第一个元素是-1 不是从零开始 >>> L[-2:] ['Bob', 'Jack'] >>> L[-2:-1] ['Bob'] ##前10个数,每两个取一个: >>> L[:10:2] [0, 2, 4, 6, 8] 迭代 for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration) for ch in 'ABC': ... print(ch) ... A B C ###字典 dict 迭代(dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()) >>> d = {'a': 1, 'b': 2, 'c': 3} >>> for key in d: ...

python-迭代器与生成器1

醉酒当歌 提交于 2019-12-10 22:14:23
python-迭代器与生成器1 迭代器与生成器 列表的定义 列表生成式:作用使代码更加简洁 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。 而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面 几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续 的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边 计算的机制,称为生成器:generator。 a=[1,2,3] print(a) a=[i*2 for i in range(10)] #也可以是传一个函数[fun for i rang(10)] print(a) #其他方式来完成: a=[] for i in range(10): a.append(i*2) print(a) 打印结果 [1, 2, 3] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 生成器:只有在调用时才会生成相应的数据,调用哪次就参生哪次。 只记录当前位置 只有一个方法_next_();2.7版本用netx(); (i*i for in in range(10))

yield from语法

吃可爱长大的小学妹 提交于 2019-12-10 16:36:36
yield from 是在Python3.3才出现的语法。所以这个特性在Python2中是没有的。 yield from 后面需要加的是可迭代对象,它可以是普通的可迭代对象,也可以是迭代器,甚至是生成器。 简单应用:拼接可迭代对象 # 我们可以用一个使用 yield 和一个使用 yield from 的例子来对比看下。 使用 yield 使用yield # 字符串 astr='ABC' # 列表 alist=[1,2,3] # 字典 adict={"name":"wangbm","age":18} # 生成器 agen=(i for i in range(4,8)) def gen(*args, **kw): for item in args: for i in item: yield i new_list=gen(astr, alist, adict, agen) print(list(new_list)) # ['A', 'B', 'C', 1, 2, 3, 'name', 'age', 4, 5, 6, 7] 使用yield from # 字符串 astr='ABC' # 列表 alist=[1,2,3] # 字典 adict={"name":"wangbm","age":18} # 生成器 agen=(i for i in range(4,8)) def gen(*args

tensorflow学习笔记——AlexNet

帅比萌擦擦* 提交于 2019-12-10 10:51:54
1,AlexNet网络的创新点   AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:    (1)成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但直到AlexNet的出现才将其发扬光大。   在最初的感知机模型中,输入和输出的关系如下:   虽然只是单纯的线性关系,这样的网络结构有很大的局限性:即使用很多这样结构的网络层叠加,其输出和输入仍然是线性关系,无法处理有非线性关系的输入输出。因此,对每个神经元的输出做个非线性的转换也就是,将上面的加权求和的结果输入到一个非线性函数,也就是激活函数中。这样,由于激活函数的引入,多个网络层的叠加就不再是单纯的线性变换,而是具有更强的表现能力。   在网络层较少时,Sigmoid函数的特性能够很好的满足激活函数的作用:它把一个实数压缩至0到1之间,当输入的数字非常大的时候,结果会接近1,;当输入非常大的负数时,则会得到接近0的结果。这种特性,能够很好的模拟神经元在受刺激后,是否被激活向后传递信息(输出为0,几乎不被激活;输出为1,完全被激活)。Sigmoid函数一个很大的问题就是梯度饱和。观察Sigmoid函数的曲线,当输入的数字较大

机器学习(4)之Logistic回归

我只是一个虾纸丫 提交于 2019-12-10 04:23:54
机器学习(4)之Logistic回归 1. 算法推导  与之前学过的梯度下降等不同,Logistic回归是一类分类问题,而前者是回归问题。回归问题中,尝试预测的变量y是连续的变量,而在分类问题中,y是一组离散的,比如y只能取{0,1}。   假设一组样本为这样如图所示,如果需要用线性回归来拟合这些样本,匹配效果会很不好。对于这种y值只有{0,1}这种情况的,可以使用分类方法进行。 假设 ,且使得 其中定义Logistic函数(又名sigmoid函数): 下图是Logistic函数g(z)的分布曲线,当z大时候g(z)趋向1,当z小的时候g(z)趋向0,z=0时候g(z)=0.5,因此将g(z)控制在{0,1}之间。其他的g(z)函数只要是在{0,1}之间就同样可以,但是后续的章节会讲到,现在所使用的sigmoid函数是最常用的 假设给定x以为参数的y=1和y=0的概率: 可以简写成: 假设m个训练样本都是独立的,那么θ的似然函数可以写成: 对L(θ)求解对数最大似然值: 为了使似然性最大化,类似于线性回归使用梯度下降的方法,求对数似然性对 的偏导,即:   注意:之前的梯度下降算法的公式为 。这是是梯度上升,Θ:=Θ的含义就是前后两次迭代(或者说前后两个样本)的变化值为l(Θ)的导数。 则 即类似上节课的随机梯度上升算法,形式上和线性回归是相同的,只是符号相反,

python中68个内置函数的总结

若如初见. 提交于 2019-12-09 20:09:33
内置函数 内置函数就是python给你提供的, 拿来直接用的函数, 比如print., input等. 截止到python版本3.6.2 python一共提供了68个内置函数. #68个内置函数 # abs()   dict()   help()   min()   setattr() # all()   dir()   hex()   next()   slice() # any()   divmod()   id()   object()   sorted() # ascii()   enumerate()   input()   oct()   staticmethod() # bin()   eval()   int()   open()   str() # bool()   exec()   isinstance()   ord()   sum() # bytearray()   filter()   issubclass()   pow()   super() # bytes()   float()   iter()   print()   tuple() # callable()   format()   len()   property()   type() # chr()   frozenset()   list()   range()   vars() #

python中68个内置函数的总结

血红的双手。 提交于 2019-12-09 16:19:04
内置函数 内置函数就是python给你提供的, 拿来直接用的函数, 比如print., input等. 截止到python版本3.6.2 python一共提供了68个内置函数. #68个内置函数 # abs()   dict()   help()   min()   setattr() # all()   dir()   hex()   next()   slice() # any()   divmod()   id()   object()   sorted() # ascii()   enumerate()   input()   oct()   staticmethod() # bin()   eval()   int()   open()   str() # bool()   exec()   isinstance()   ord()   sum() # bytearray()   filter()   issubclass()   pow()   super() # bytes()   float()   iter()   print()   tuple() # callable()   format()   len()   property()   type() # chr()   frozenset()   list()   range()   vars() #

JDK8 Stream 数据流效率分析

夙愿已清 提交于 2019-12-09 05:30:51
JDK8 Stream 数据流效率分析 Stream 是Java SE 8类库中新增的关键抽象,它被定义于 java.util.stream (这个包里有若干流类型: Stream<T> 代表对象引用流,此外还有一系列特化流,如 IntStream,LongStream,DoubleStream等 ),Java 8 引入的的Stream主要用于取代部分Collection的操作, 每个流代表一个值序列,流提供一系列常用的聚集操作 ,可以便捷的在它上面进行各种运算。集合类库也提供了便捷的方式使我们可以以操作流的方式使用集合、数组以及其它数据结构; stream 的操作种类 ①中间操作 - 当数据源中的数据上了流水线后,这个过程对数据进行的所有操作都称为“中间操作”; - 中间操作仍然会返回一个流对象,因此多个中间操作可以串连起来形成一个流水线; - stream 提供了多种类型的中间操作,如 filter、distinct、map、sorted 等等; ②终端操作 - 当所有的中间操作完成后,若要将数据从流水线上拿下来,则需要执行终端操作; - stream 对于终端操作,可以直接提供一个中间操作的结果,或者将结果转换为特定的 collection、array、String 等; 这一部分详细的说明可以参见: JDK8 Stream 详细使用 stream 的特点 ①只能遍历一次:

编程中,循环、迭代、遍历和递归之间的区别

白昼怎懂夜的黑 提交于 2019-12-09 04:54:01
表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环 算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. 大部分的递归, 遍历, 迭代, 都是循环. 递归 的定义是, 根据一种(几种)基本情况定义的算法, 其他复杂情况都可以被逐步还原为基本情况. 在编程中的特征就是, 在函数定义内重复调用该函数. 例如斐波那契数列, 定义F(0)=1, F(1)=1, 所有其他情况: F(x)=F(x-1)+F(x-2). 所有大于1的整数经过有限次的反推之后都可以转换到两种基本情况. 而在编程中, 算法则是这样的: int F(x) { if(x==0 || x==1) return 1; //这里是退出递归的条件, 以保证在有限次递归后能够得到结果 return F(x-1)+F(x-2); //转化为更为基本的情况, 重复调用自身进行计算 } 迭代在数学和编程中有不同的含义. 迭代(数学) : 在循环的基础上, 每一次循环, 都比上一次更为接近结果. 例如下面是一个迭代的例子: int result = 0; for(int i=0; i<10; i++) result += i; //每一次循环之后, result都更加接近结果45 有很多数学问题, 都是迭代算法, 如牛顿迭代法