迭代计算

数据与任务的并行---Parallel类

不羁岁月 提交于 2020-02-04 06:40:07
  Parallel类是对线程的抽象,提供数据与任务的并行性。类定义了静态方法For和ForEach,使用多个任务来完成多个作业。Parallel.For和Parallel.ForEach方法在每次迭代的时候调用相同的代码,而Parallel.Invoke()方法允许同时调用不同的方法。Parallel.ForEach()方法用于数据的并行性,Parallel.Invoke()方法用于任务的并行性。 1、For()方法   For()方法用于多次执行一个任务,可以并行运行迭代,但迭代的顺序并没指定。For()方法前两个参数为定义循环的开始和结束,第三个参数为Action<int>委托。方法的返回值是ParallelLoopResult结构,它提供了是否结束的信息。如以下循环方法,不能保证输出顺序: static void ParallelFor() { ParallelLoopResult result = Parallel.For(0, 10, async i => { Console.WriteLine("{0}, task: {1}, thread: {2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId); await Task.Delay(10);//异步方法,用于释放线程供其他任务使用。完成后

《c++primer》笔记 第3章 字符串、向量和数组

廉价感情. 提交于 2020-02-03 09:52:04
标准库类型 本章重要的两个: string 和 vector ,以及配套的迭代器。 3.1 命名空间的using声明 using声明具有如下的形式: using namespace::name; 一旦声明了上述语句,就可以直接访问命名空间中的名字: #include<iostream> //using声明,当我们使用名字cin时,从命名空间std中获取它 using std::cin; int main() { int i; cin >> i;//正确:cin和std::cin含义相同 cout << i;//错误:没有对应的using声明,必须使用完整的名字 std::cout << i;//正确:显式地从std中使用cout return 0; } 用下面的using可以使用std里面的所有名字: using namespace std; 头文件不应包含using声明 3.2 标准库类型string 初始化string对象的方式 string s1; //默认初始化,si是一个空串 string s2(s1); //s2是s1的副本 string s2=s1; //等价于s2(sl>,s2是s1的副本 string s3("value"); //S3是字面值"value"的副本,除了字面值最后的那个空字符外 string s3="value"; //等价于s3("value")

机器学习实战(五)逻辑回归实战篇之预测病马死亡率 (Peter Harrington著)

风格不统一 提交于 2020-02-02 07:51:07
一 前言 本文对梯度上升算法和改进的随机梯度上升算法进行了对比,总结了各自的优缺点,并对sklearn.linear_model.LogisticRegression进行了详细介绍。 二 改进的随机梯度上升算法 梯度上升算法在每次更新回归系数(最优参数)时,都需要遍历整个数据集。可以看一下我们之前写的梯度上升算法: def gradAscent(dataMatIn, classLabels): dataMatrix = np.mat(dataMatIn) #转换成numpy的mat labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置 m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。 alpha = 0.01 #移动步长,也就是学习速率,控制更新的幅度。 maxCycles = 500 #最大迭代次数 weights = np.ones((n,1)) for k in range(maxCycles): h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式 error = labelMat - h weights = weights + alpha * dataMatrix.transpose() * error

Java8学习(4)-Stream流

℡╲_俬逩灬. 提交于 2020-02-01 14:44:00
Stream和Collection的区别是什么 流和集合的区别是什么? 粗略地说, 集合和流之间的差异就在于 什么时候 进行计算。集合是一个内存中的数据结构,它包含数据结构中目前所有的值--集合中的每个元素都得先计算出来才能添加到内存里。(你可以往集合里加东西或者删东西,但是不管什么时候,集合中的每个元素都是放在内存里的,元素都得计算出来才能成为集合的一部分。) 相比之下,流则是在概念上固定的数据结构(你不能添加或者删除元素),其元素则是 按需计算 的。这对编程有很大的好处。用户仅仅从流中提取需要的值,而这些值--在用户看不见的地方--只会 按需 生成。这是一种生产者 - 消费者的关系。从另一个角度来说,流就像一个延迟创建的集合:只有在消费者要求的时候才会计算值。 Stream是内部迭代 一个明显的区别是迭代方式不同。Collection需要手动 for-each 或者使用 Iterator 在外部迭代。而Stream则开启后可以直接对单个元素进行操作,内部帮你做好了迭代工作。 内部迭代的好处是可一个更好的并行。自己手写迭代需要处理好每次迭代的内容。为了提高执行效率,也许会把多个处理逻辑写到同一个遍历里。比如,有同事看到从scala转过来的同事的代码,说他写的代码经常重复好多次。scala是函数式语言,和流天然集成。而我们惯性的做法,还是把一堆操作逻辑写到同一个循环体中

迭代器、生成器、可迭代对象

安稳与你 提交于 2020-02-01 10:55:39
迭代器出现的原因 Python中的列表,有可能会占用很大的空间。而迭代器,它是每一次用__next__调用时才计算出值,这会节省内存空间。 迭代器、生成器、可迭代对象的关系 可迭代对象一般是列表、元组、字典、字符串等可以For循环的对象。可通过以下语句判断是不是可迭代对象。 from collections.abc import Iterator, Iterable l = [1, 2, 3, 4, 5] print(isinstance(l, Iterable)) # True 而且每个可迭代器都有__iter__方法,并且此方法返回一个迭代器。 那么什么是迭代器呢?它与可迭代对象有什么关系?为什么for循环可以得出每人元素的值?那是因为可迭代对象有一个记录员,可记录当前位置。而这个记录员就是迭代器。可迭代对象可生成迭代器,如下: l = [1, 2, 3, 4, 5] it = iter(l) print(isinstance(it, Iterator)) # True 每个迭代器都有__next__方法。而生成器是迭代器的一种,除了有__next__方法以外,还要用到yield。 for循环的本质 其实for循环一个可迭代对象,为我们做了以下事情 1、通过可迭代对象生成一个迭代器 2、调用迭代器的__next__方法,生成值 3、遇到错误时,就退出 以下程序就说明了这个问题

Power up C++ with the Standard Template Library: Part I[翻译]

隐身守侯 提交于 2020-01-31 12:39:35
Power up C++ with the Standard Template Library: Part I 【原文见: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=standardTemplateLibrary 】 作者 By DmitryKorolev Topcoder 成员 翻译 农夫三拳@seu Containers Before we begin Vector Pairs Iterators Compiling STL Programs Data manipulation in Vector String Set Map Notice on Map and Set More on algorithms String Streams Summary 也许你已经使用C++作为主要编程语言来解决Topcoder中的问题了,这就意味着你已经在简单的使用 STL了,因为数组和字符串都是以STL对象的方式传入到你的函数中的。也许你已经注意到了,有许多 程序员他们写代码要比你快并且代码也比你的简洁。 也许你不是一个C++程序员,但是因为C++的强大功能以及它的库(或者因为你在Topcoder practice 房间和比赛里面看到的简短的解决方案),你想成为一个这样的程序员。 不管你来自哪里,这篇文章将会帮助你掌握它

Java-8-流(1)

半城伤御伤魂 提交于 2020-01-31 05:40:32
Java-8-流(1) 外部迭代与内部迭代 Java 程序员在使用集合类时,一个通用的模式是在集合上进行迭代,然后处理返回的每一 个元素 在数字集合里面统计大于100的数有几个 public static void main(String[] args) { List<Integer> data = Number_Data.createData(); int count = 0; for (Integer integer : data){ if (integer > 100){ count++; } } System.out.println(count); } 尽管这样的操作可行,但存在几个问题。每次迭代集合类时,都需要写很多样板代码。将for 循环改造成并行方式运行也很麻烦,需要修改每个 for 循环才能实现 for 循环的样板代码模糊了代码的本意,程序员必须阅读整个循环体才能理解。若是单一的 for 循环,倒也问题不大,但面对一个满是循环(尤其是嵌套循环)的庞大代码库时,负担就重了 for 循环其实是一个封装了迭代的语法糖看看它的工作原理。首先调用 iterator 方法,产生一个新的 Iterator 对象,进而控制整个迭代过程,这就是外部迭代。迭代过程通过显式调用 Iterator 对象的 hasNext 和 next方法完成迭代

dict.c设计思想

試著忘記壹切 提交于 2020-01-29 08:24:52
双hash_table设计 typedef struct dict { dictType * type ; void * privdata ; dictht ht [ 2 ] ; long rehashidx ; int iterators ; } dict ; 作者在dict数据类型中引入了两个hash_table,其作用是为了动态变化hash_table的大小。 按照常规操作,如果我们想要将一个hash_table的大小进行动态变化,我们需要进行两个步骤 1:改变数组大小 2:将old_hash_table内全部元素进行rehash,重新链接至new_hash_table上。 如果我们在瞬时间内完成从old_hash_table到new_hash_table的转化的话,意味着我们必须对old_hash_table的元素全部遍历一遍,这种操作显然是很费时间的,容易导致CPU在一段时间内处于一个很繁忙的状态(这里没有引入线程什么的,所以这个操作在dict内存储很多数据时,很可能致使Redis无法及时相应其他请求,而致使服务质量下降)。 因此这里引入了一个 rehash 状态,表示当前字典正在进行 rehash ,即将old_hash_table数据迁移至new_hash_table的状态。通过阅读源代码,我们会发现这样一个函数 static void _dictRehashStep

乱入:生成器+习题复习

被刻印的时光 ゝ 提交于 2020-01-28 23:56:27
##:生成器 (虽然说生成器和迭代器可以说是Python近几年来引入的最强大的两个概念,但是生成器的学习并不涉及到高级的魔法方法,甚至巧妙的避开了类和对象,仅需要通过普通的函数就可以实现了,由于生成器的概念比较高级,所以在之前的函数章节并没有讲到它,学习就是需要一个渐进的过程。像上一节课的迭代器,很多人学了之后就感觉很简单,但是如果我们把迭代器放到循环那一章节来讲,大家势必就会一头雾水了。) (生成器事实上是迭代器的一种实现,那既然迭代器可以实现,那为什么还要生成器呢?有一句老话说得好:“存在即合理”。生成器的发明一方面就是使得Python更为简洁,因为迭代器需要我们去定义一个类和实现相关的方法,才可以定义一个灵活的迭代器。而生成器需要在普通的函数加上一个 yield 语句。另外一个重要的方面就是生成器的发明使得Python模仿协同程序的概念得以实现。) (所谓的协同程序就是 可以运行的独立函数 的调用,函数可以暂停或者挂起,并且在需要的时候从函数上一次离开的地方继续或者重新开始。那我们知道,对于一个普通的函数来说,我们调用它一般都是从函数的第一句开始走,结束用 return 语句或者 异常 或者 函数所有的语句执行完毕。一旦函数将控制权交还给调用者,那就意味着全部都结束了,因为我们说过:函数的所有的工作、保存都是局部变量,局部变量在调用结束都会自动消失。) (而 生成器 就是一个

python 迭代器&&生成器

末鹿安然 提交于 2020-01-28 17:21:18
有一篇文章写得迭代器和生成器,写得很好:https://www.cnblogs.com/wj-1314/p/8490822.html #列表生成器print([i*2 for i in range(10)])#生成器:把列表中的[]修改为(),生成器调用时才会产生相应的数据,不调用时不暂用内存,同时只记住当前的位置,只有一个__next__()方法b=(i*2 for i in range(10))for i in b: print(i) 什么是生成器?   通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。   所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator   生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用 next()函数和send()函数 恢复生成器。   生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用