C# 并行编程 之 PLINQ 规约操作和聚合函数
PLINQ可以简化对一个序列或一个组中所有成员应用同一个函数的过程,这个过程称之为规约操作。类似Sum()函数就是一个规约操作。PLINQ提供一个可重载Aggregate的接口,这里用户可以定义自己的规约函数。
规约操作是对每一个成员进行的操作,当操作完成后有可能需要将操作结果进行汇总得到一个最终的结果,这个就是聚合的概念。
规约操作示例中要求计算 1 到 50000000中能被5整除的数除以PI以后得到的平均数。它可以用LINQ完成,也可以用PLINQ完成。
代码示例:
using System; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Diagnostics; using System.Linq; using System.IO; using System.Collections.Generic; namespace Sample6_2_plinq_calculate { class Program { static int NUM_INTS = 50000000; static IEnumerable<int> GenerateInputeData() { return Enumerable.Range(1, NUM_INTS); } static ParallelQuery<int> GenerateInputeData4Parallel() { return ParallelEnumerable.Range(1, NUM_INTS); } static void Main(string[] args) { var seqTarget = GenerateInputeData(); Console.WriteLine("============================================================"); Console.WriteLine("TEST NORMAL LINQ"); Console.WriteLine("============================================================"); var swatchpn = Stopwatch.StartNew(); var seqQuery = (from intNum in seqTarget where ((intNum % 5) == 0) select (intNum / Math.PI)).Average(); swatchpn.Stop(); Console.WriteLine("LINQ Result: " + seqQuery + " LINQ Use Time: {0}", swatchpn.Elapsed); var palTarget = GenerateInputeData4Parallel(); Console.WriteLine("\n\n"); Console.WriteLine("============================================================"); Console.WriteLine("TEST PARALLEL LINQ"); Console.WriteLine("============================================================"); var swatchp = Stopwatch.StartNew(); var palQuery = (from intNum in palTarget.AsParallel() where ((intNum % 5) == 0) select (intNum / Math.PI)).Average(); swatchp.Stop(); Console.WriteLine("PLINQ Result: " + palQuery + " LINQ Use Time: {0}", swatchp.Elapsed); Console.ReadLine(); } } }测试结果:
代码示例会计算一个数组的标准偏差,偏度,和峰度来说明聚合的使用。
顺便补补数学吧:
标准偏差:一种量度数据分布的分散程度之标准,用以衡量数据值偏离算术平均值的程度。标准偏差越小,这些值偏离平均值就越少,反之亦然。标准偏差的大小可通过标准偏差与平均值的倍率关系来衡量。
图片公式来自百度百科。
偏度:偏度系数是描述分布偏离对称性程度的一个特征数。当分布左右对称时,偏度系数为0。当偏度系数大于0时,即重尾在右侧时,该分布为右偏。当偏度系数小于0时,即重尾在左侧时,该分布左偏。
峰度:表示分布相对于正太分布而言是更加高耸还是更加平坦。正值表示相对高耸的分布,负值表示相对平坦的峰度。简单的说,峰度是描述分布形态的陡缓程度。也可以这样理解,在相同的标准差下,,峰度系数越大,分布就有更多的极端值,那么其余值必然要更加集中在众数周围,其分布必然就更加陡峭。
关于Aggregate 函数的参数说明参考
https://msdn.microsoft.com/en-us/zh-en/library/dd383667(v=vs.110).aspx
关于参数的简单说明:
seed:是累加器初始化的值。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71340.html
- 上一篇:微软发布的Win10开发者指南视频
- 下一篇:windows查看端口解除端口占用