关键词:
最近在解决性能优化的问题,看到了一堆嵌套循环,四五层级的循环真的有点过分了,在数据量成万,十万级别的时候,真的非常影响性能。
当然,除了关注明显的循环例如for、foreach,还应该关注隐晦一点的循环,例如datatable.select(),linq之类的list.where、list.find等。
要优化,排除业务问题,要考虑的就是代码技术了。看到循环查找数据,尽可能向Dictionary靠拢。
eg1:一个简单的key对应一条datarow
优化前:
using System.Linq; namespace ConsoleApp1 internal class Program private static void Main(string[] args) DataTable table = new DataTable(); ... for (int i = 0; i < 1000000; i++) var row = table.AsEnumerable().FirstOrDefault(r => r["num"].ToString() == i.ToString()); ...
优化后:
using System.Data; using System.Linq; namespace ConsoleApp1 internal class Program private static void Main(string[] args) DataTable table = new DataTable(); ... var dict = table.AsEnumerable().ToDictionary(r => r["num"].ToString()); for (int i = 0; i < 1000000; i++) if (dict.ContainsKey(i.ToString())) var row = dict[i.ToString()]; ...
eg2:一个拼装的Key对应多条DataRow的字典
优化前:
using System.Data; using System.Linq; namespace ConsoleApp1 internal class Program private static void Main(string[] args) DataTable table = new DataTable(); ... for (int i = 0; i < 1000000; i++) var name = ""; ... var rows = table.AsEnumerable().Where(r => r["num"].ToString() == i.ToString() && r["name"].ToString() == name);
优化后:
using System.Data; using System.Linq; namespace ConsoleApp1 internal class Program private static void Main(string[] args) DataTable table = new DataTable(); var group = table.AsEnumerable().GroupBy(r => GetGroupKey(r["num"].ToString(), r["name"].ToString())); var dict= group.ToDictionary(r=>r.Key); ... for (int i = 0; i < 1000000; i++) var name = ""; var key = GetGroupKey(i.ToString(), name); if (dict.ContainsKey(key)) var rows = dict[key]; ... private static string GetGroupKey(string _num,string _name) return $"num=_num|name=_name";
使用具有多个参数和索引的lapply/sapply减少函数内的嵌套循环(代码片段)
我有两个观察向量,我想要计算哪些参数最适合这些观察。因此,我已经定义了似然函数。我正在努力从嵌套for循环到使用sapply。我的目标是返回观察“芽”概率的(50x1)向量。>bud[1]1.721.121.011.141.561.041.001.391.38[10]0.991.661.552.2... 查看详情
如何实现滑动窗口或减少这些嵌套循环?
】如何实现滑动窗口或减少这些嵌套循环?【英文标题】:Howtoimplementslidingwindoworreducethesenestedloops?【发布时间】:2020-03-1900:09:36【问题描述】:我正在尝试减少这些循环以优化一些代码。有人建议我使用滑动窗口技术,但我似... 查看详情
代码规范(代码片段)
7.3.10尽量减少循环嵌套层次。7.3.11避免循环体内含判断语句避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。说明:目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而... 查看详情
代码规范(代码片段)
7.3.10尽量减少循环嵌套层次。7.3.11避免循环体内含判断语句避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。说明:目的是减少判断次数。循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而... 查看详情
如何从 C# 中的嵌套循环写入多维数组?
】如何从C#中的嵌套循环写入多维数组?【英文标题】:HowtowritetomultidimensionalarrayfromnestedloopinC#?【发布时间】:2020-07-0315:44:38【问题描述】:我是C#新手。我在Unity中编写了一个代码,它创建了多个(9,3x3)多维数据集,并且我使用... 查看详情
如何打破嵌套的foreach循环然后转到c#上的父foreach循环
】如何打破嵌套的foreach循环然后转到c#上的父foreach循环【英文标题】:Howtobreaknestedforeachloopthengotoparentforeachlooponc#【发布时间】:2013-07-0913:47:31【问题描述】:我有以下代码:foreach(//Someconditionhere)while(//Someconditionhere)foreach(//Somec... 查看详情
嵌套循环概念(代码片段)
嵌套循环:循环体中还可以声明循环,相当于内层循环的整体充当外层循环的循环体例:for(;;)for(;;)或者while()for(;;)题目:输出四排*,要求用嵌套循环**********publicclassVpublicstaticvoidmain(String[]args)for(inti=0;i<4;i++)for(intj=0;j<i+1;j++)S 查看详情
如何减少python中嵌套循环的时间
】如何减少python中嵌套循环的时间【英文标题】:howtoreducethetimeofanestedloopinpython【发布时间】:2022-01-0417:59:16【问题描述】:我正在从ESPN获取球员数据,但我发现自己的问题是获取每个变量的等待时间很长,如何提高效率?playe... 查看详情
C#:循环遍历嵌套结构的成员对象
】C#:循环遍历嵌套结构的成员对象【英文标题】:C#:Loopingthroughmemberobjectsofnestedstructs【发布时间】:2021-12-2718:06:42【问题描述】:大家好,所有c#向导!我需要将(打包的)嵌套结构的所有内存偏移值存储在这些各自的结构中... 查看详情
python入门-4控制语句:07嵌套循环-练习(代码片段)
嵌套循环及练习: 一个循环体内可以嵌入另一个循环,一般称为“嵌套循环”,或者“多重循环”。【练习】1#测试嵌套循环2forxinrange(5):3foryinrange(5):4print(x,end=‘\t‘)5print()#起到换行的作用67print(‘###################... 查看详情
constraintlayout使用详解,减少嵌套ui,提升性能(代码片段)
前言对于初学者来说,可能觉得ConstraintLayout属性多,且属性长而弃用它,那你错失了这个大宝贝。因为在复杂布局,我们会一直用RelativeLayout和LinearLayout去嵌套,因为嵌套的ViewGroup会导致手机多次测量和绘制... 查看详情
java[嵌套循环]#java#forloop(代码片段)
while循环嵌套需要注意的点,(代码片段)
在whileTrue的循环嵌套中循环套循环内,子循环被break或者continue后,如果子循环后面没有和他属于同一权力的,就会返回上一循环,继续循环下去但是如果有和他属于同一权力的(也就是在子循环下面的代码和子循环同一列的)子循... 查看详情
python入门-4控制语句:09循环代码优化技巧(重要)-zip()并行迭代(代码片段)
...提高运行效率,避免不必要的低效计算: 1.尽量减少循环内部不必要的计算 2.嵌套循环中,尽量减少内层循环的计算,尽可能向外提。 3.局部变量查询较快,尽量使用局部变量 其他优化手段: ... 查看详情
流程控制与循环(代码片段)
...行代码块Belse:?代码块C#以上条件均不成立时运行代码块C嵌套ifif条件A:?if条件B:?代码块#条件A成立,并且条件B成立时运行代码块while循环while条件A:代码块A(循环体)#当条件A成立时,运行循环体else:代码块B#当条件 查看详情
嵌套循环有两个while循环(代码片段)
所以我必须提出一个输出报告的代码,我必须在另一个while循环中包含这个while循环,这个循环会询问用户是否要继续输入信息。只要用户响应“Y”,继续询问所需输入并打印报告。一旦用户回答“N”,则停止进一步处理。我刚... 查看详情
循环嵌套(代码片段)
n=int(input(‘请输入一个整数:‘))#控制打印多少行foriinrange(n):#控制一行打印多少个forjinrange(1+i):print(j,‘*‘,end=‘‘)print()‘‘‘n=int(input(‘请输入一个整数:‘))#先控制行数foriinrange(n):#控制每一行的打印个数forjinrange(i+1):print(j+1,... 查看详情
o纬度减少循环次数(代码片段)
O(1)纬度减少循环次数 平时看淡,不服就干。老子有句粗口话不知道当不当讲,我们公司上一次发工资时4月4号,时至今日5-30已经有57天没有发工资了,我还要继续坚持下去吗?难不成现在大家工作都TM的不在乎钱了的吗?使... 查看详情