Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何循环通过值为arrayref的HoA?

如何循环通过值为arrayref的HoA?
EN

Stack Overflow用户
提问于 2013-04-02 02:41:03
回答 2查看 69关注 0票数 0

我想让我的脚本尽可能的高效和快速地运行。下面是我创建HoA的方法。

代码语言:javascript
运行
AI代码解释
复制
use strict; use warnings; open(my $fh, '<', 'file.txt') or die $!;
my %HoA;
while (<$fh>){
    $_=~ s/\r//;
    chomp;
    my @cols = split(/\t/, $_);
    my $key = shift @cols;
    push( @{$HoA{$key}, @cols );
}

假设它提供了以下数据结构

代码语言:javascript
运行
AI代码解释
复制
%HoA = (
    'C1' => ['1', '3', '3', '3'],
    'C2' => ['3','2'],
    'C3' => ['1','3','3','4','5','5'],
    'C4' => ['3','3','4'],
    'C5' => ['1'],
);

现在假设对于HoA中的每个键,我希望将它的值(数组)和整个HoA传递到一个名为compute的子例程中。

这是我目前正在做的事情。

代码语言:javascript
运行
AI代码解释
复制
foreach my $key ( keys %HoA ) {
    compute($HoA{$key}, \%HoA);  # on the first iteration, this actually passes an aref to [1,3,3,3]
}

显然,$HoA{ $key }已经是对特定$key每个值的数组引用。

如果是这样的话,执行以下操作在效率方面是否有优势

代码语言:javascript
运行
AI代码解释
复制
push( @{$HoA{$key}, \@cols );

它产生以下数据结构

代码语言:javascript
运行
AI代码解释
复制
%HoA = (
    'C1' => [ ['1', '3'], ['3', '3'] ],
    'C2' => [ ['3','2'] ],
    'C3' => [ ['1','3'], ['3','4'], ['5','5'] ],
    'C4' => [ ['3','3','4'] ],
    'C5' => [ ['1'] ],
);

这会让我的脚本运行得更快吗?如果是这样,在这种情况下,我如何将每个键的值( array_ref)传递给子例程?一旦它在子例程中,我如何访问数组中的单个元素,而不在子例程中取消对整个array_ref的引用?另外,对于$hash_ref,如何访问每个array_ref?

下面是我目前使用的方法

代码语言:javascript
运行
AI代码解释
复制
sub compute{
# takes one param: an arrayref
my ($array_ref, $hash_ref) = @_;
    for my $p ( @{ $array_ref) ) {
        # do stuff
    }
    for my $x ( values %{ %hash_ref)) {
        # do stuff
    }
}
EN

回答 2

Stack Overflow用户

发布于 2013-04-02 02:47:16

由于代码中的取消引用,这可能会使代码运行速度变慢。此外,您需要扁平化每个散列条目指向的数组中包含的数组,如下所示:

代码语言:javascript
运行
AI代码解释
复制
my %h = ( a => [ [1, 2], [3, 4] ], b => [ [2, 3], [5, 6] ]); 
my $key = 'a';
my @all_items;
@all_items = map { @$_ } @{$h{$key}};

仅凭经验,在Perl中取消引用对象(即数组)的成本可能会非常高,因此使用较少引用的第一个方法应该会更快。但是你可以给这些东西计时。最好的做法是只编写代码,然后在对整个代码进行概要分析后,再考虑真正重要的部分。

票数 1
EN

Stack Overflow用户

发布于 2013-04-02 03:15:28

如果是这样的话,执行以下操作在效率方面是否有优势

push( @{$HoA{$key},\@cols );

不是的。首先,正确地创建数据结构

代码语言:javascript
运行
AI代码解释
复制
push @{ $HoA{$key} }, @cols;    # Copies the number to the anon array.

compute($_, \%HoA) for values %HoA;

总比稍后重新创建正确的数据结构要好。

代码语言:javascript
运行
AI代码解释
复制
push @{ $HoA{$key} }, \@cols;

compute([ map @$_, @$_ ], \%HoA) for values %HoA;  # But so does this.

通过切换,您最终将在已有工作的基础上完成适当的超集。

正如评论中提到的,你优化的是错误的东西。你说你的程序需要30-40秒才能运行。即使你将加载文件的时间减少到零,你的程序仍然需要29-39秒。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15755183

复制
相关文章
如何优雅判断属性值为空
假设我们现在需要取出 a.b.c,但是并不清楚它们是否都存在,那么代码会写成这样:
前端达人
2019/12/24
4.2K0
如何优雅判断属性值为空
利用 for 循环计算 n! 的值
阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。 亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
Skykguj
2022/09/09
1.8K0
如何通过CM为HDFS启用Federation
本文主要讲述如何通过CM为HDFS启用Federation。如果你对HDFS的Federation不太了解或者想知道Federation能够解决什么问题的话,建议先阅读我之前写的这篇文章《HDFS Federation(联邦)简介》
Fayson
2018/09/29
2.3K0
爬虫 (十八) 如何通过反编译理解 for 循环 (十)
前面的基本运算符加减乘除等运算符内容,我们就不讲了,我觉得最应该讲讲就是 for 循环运算符这东西,真的是需要我们去好好探讨一下的,记得关注点赞哦,谢谢
公众号---人生代码
2020/01/14
1.8K0
爬虫 (十八) 如何通过反编译理解 for 循环 (十)
[编程] C语言循环结构计算π的值
分析:首先,系数为正数的项的分母是4n-3(n为正数项的项数),为负数的项的分母为4n-1(n为负数项的项数),即分母的变化规律是1、3、5、7...的奇数数列,则第n项的分母为2n-1,第10000项的分母为2*10000-1。
唯一Chat
2019/09/10
3.6K0
solidity智能合约如何判断mapping值为空
在Java这类编程语言中,我们可以获得Map里面的值然后与null或空来进行判断该key对应的值是否为空。可是在solidity中貌似并没有提供类似的判断。那么我们如果来进行mapping值的判断呢。
程序新视界
2019/08/01
4K0
如何通过三级缓存解决 Spring 循环依赖
这个其实是一个特别高频的面试题,松哥也一直很想和大家仔细来聊一聊这个话题,网上关于这块的文章很多,但是我一直觉得要把这个问题讲清楚还有点难度,今天我来试一试,看能不能和小伙伴们把这个问题梳理清楚。
江南一点雨
2023/09/09
3030
如何通过三级缓存解决 Spring 循环依赖
Spring如何通过三级缓存解决循环依赖
这个例子存在的问题:理论上spring创建A的时候依赖了B,然后spring就会去加载B,但是这个时候B又依赖了A,spring又去加载A,就会陷入一个死循环,但我们在实际使用spring的时候并没有出现这样的循环,这是因为spring设计之初就考虑了这个问题,那么spring是如何解决的呢?我们先要明确的是spring对循环依赖的处理有三种情况,分别为
诺浅
2020/08/19
1K0
通过代码实例说明如何化腐朽为优雅
​  最近我负责的活动促销系统中要在审批的时候增加计算参加活动的商品的毛利率的需求。但是我负责打辅助,主要是同事负责具体开发,我了解了他的实现方式思路以后,果断拒绝了,并给出了我的解决方案以及优点,他发现我的方案确实扩展性和可维护性更好以后就采用了,本文就来通过这个实例来说明如何让本腐朽的代码变得优雅起来。
阿豪聊干货
2018/08/09
3300
如何通过执行SQL为低代码项目提速?
见多了SQL为代码开发提速,那么当低代码遇到SQL会擦出怎样的火花呢?本文将低代码和SQL结合进行介绍,让大家了解如何通过执行SQL为低代码项目提速。
葡萄城控件
2022/10/04
1.4K0
如何通过执行SQL为低代码项目提速?
05 . Python入门值循环语句
程序一般情况下是按照顺序执行的 编程语言提供了各种控制结构,允许更复杂的执行路径 Python中的循环语句有for和while但没有do while
iginkgo18
2020/09/27
5360
05 . Python入门值循环语句
ArcMap将栅格0值设置为NoData值的方法
  本文介绍在ArcMap软件中,将栅格图层中的0值或其他指定数值作为NoData值的方法。
疯狂学习GIS
2023/06/26
9610
ArcMap将栅格0值设置为NoData值的方法
JavaScript 判断输入的值为数字
使用js自带全局函数isNaN(), isNaN()返回一个Boolean值,如下 :
Devops海洋的渔夫
2019/06/02
3.7K0
如何通过Cloudera Manager为Kafka启用Kerberos及使用
在CDH集群中启用了Kerberos认证,那么我们的Kafka集群能否与Kerberos认证服务集成呢?本篇文章主要讲述如何通过Cloudera Manager为Kafka集群启用Kerberos认证及客户端配置使用。
Fayson
2018/03/29
3.2K0
如何通过Cloudera Manager为Kafka启用Kerberos及使用
JavaScript 解析 XML 时如何通过名称直接取到值?
同级的Attribute,有没有办法通过类似于 getXXXByName("aa") 得到0, getXXXByName("bb") 得到1呢?
阿敏总司令
2019/02/28
7500
js 为 li 循环添加 class
前段时间有个小伙伴想在新闻列表页面的 ul 里面为每个 class 循环添加带 1  2  3  4的 class,正巧昨天做一个站也用到了类似 for 循环,现在分享出来,很多东西都是通用的。
Savalone
2020/01/06
9.9K0
Perl与数据库DBI快速入门
习惯在Windows下开发数据库、熟悉ADO、ADO.NET的朋友,一定对ADOConnection/ADODataSet/ADOTable等类耳熟能详。DBI的接口与之类似,但在操作方法上又有不同,对ADO熟悉的朋友不妨比较一下异同。一般来说,数据库操作由以下几个步骤组成一个常见的流程:
明哥的运维笔记
2019/01/30
1.3K0
python如何使用for循环_Python 中for循环的应用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170074.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
7.5K0
点击加载更多

相似问题

以fetchall_arrayref为单位的foreach值

32

从ArrayRef[HashRef]强制使用ArrayRef[MyClass]

21

通过arrayref进行解析并添加到新的

22

ArrayRef的目的

11

两个HoA中的FInd重叠值

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档