Performance 更有效地通过数组的散列循环
我有一个数组散列。这是最有效和最快的循环方式Performance 更有效地通过数组的散列循环,performance,perl,optimization,hash,memory-efficient,Performance,Perl,Optimization,Hash,Memory Efficient,我有一个数组散列。这是最有效和最快的循环方式 my %h1 = ( C1 => ['3','1','2'], C2 => ['6','2','4'], C3 => ['8', '1'], ); 选项1 foreach my $key ( keys %HoA ) { print "Articles in group $key are: "; foreach ( @{$HoA{$key}} ) { print "$_\n"; }
my %h1 = (
C1 => ['3','1','2'],
C2 => ['6','2','4'],
C3 => ['8', '1'],
);
选项1
foreach my $key ( keys %HoA ) {
print "Articles in group $key are: ";
foreach ( @{$HoA{$key}} ) {
print "$_\n";
}
}
选项2
while( my ($k, $v) = each %HoA ) {
print "Articles in group $k are: @$v\n";
}
如果我在一个巨大的HoA中循环,哪一个能节省我的时间呢?使用
每一个可能会更清晰,可能会更快一些,但不管你怎么做,你都不会得到任何有意义的东西
while (my ($key, $val) = each %HoA) {
print "Articles in group $key are: ";
foreach ( @$val ) {
print "$_\n";
}
}
使用每一个可能会更清晰,速度可能会稍微快一点,但不管你怎么做,你都不会得到任何有意义的东西
while (my ($key, $val) = each %HoA) {
print "Articles in group $key are: ";
foreach ( @$val ) {
print "$_\n";
}
}
据我所知,键
将预先构建所有哈希键的完整列表,这可能导致大量内存用于大型哈希。我认为这是考虑的一点,因为你说你有一个巨大的HoA
对我来说,一些主要的区别在于,有时您需要一个按值或数组元素数排序的列表,我认为您无法控制每个
返回的键值对的顺序。因此,在需要排序列表的情况下,我将使用键
。如果您的散列非常非常大,并且您需要键和值,但顺序并不重要,我会使用每个
,因为它只返回两个元素(您的键值对)的列表。另一个要考虑的是使用数据库,正如其他人所建议的那样,但这可能要根据数据的大小而定。
我认为在不了解更多数据(并直接测试数据)的情况下,很难回答“按键是否比每个按键都快?”这个问题,但我认为回答“在这种情况下我应该使用按键还是每个按键?”这个问题可能更容易,这取决于你的目标和“巨大的HoA”的含义,我认为有一种方法可能更有效,并产生更好的性能,至少在内存方面是如此。其他人对此可能有不同的意见和经验,因此我希望得到任何反馈。我的理解是,键将预先构建所有哈希键的完整列表,这可能会导致大量内存用于大型哈希。我认为这是考虑的一点,因为你说你有一个巨大的HoA
对我来说,一些主要的区别在于,有时您需要一个按值或数组元素数排序的列表,我认为您无法控制每个
返回的键值对的顺序。因此,在需要排序列表的情况下,我将使用键
。如果您的散列非常非常大,并且您需要键和值,但顺序并不重要,我会使用每个
,因为它只返回两个元素(您的键值对)的列表。另一个要考虑的是使用数据库,正如其他人所建议的那样,但这可能要根据数据的大小而定。
我认为在不了解更多数据(并直接测试数据)的情况下,很难回答“按键是否比每个按键都快?”这个问题,但我认为回答“在这种情况下我应该使用按键还是每个按键?”这个问题可能更容易,这取决于你的目标和“巨大的HoA”的含义,我认为有一种方法可能更有效,并产生更好的性能,至少在内存方面是如此。其他人可能对此问题有不同的意见和经验,因此我希望得到反馈。您的基准测试告诉您什么?目前我有一个子程序,使用嵌套for looped(选项1)在大型HoA中循环。使用嵌套for循环,子例程运行大约需要5-12秒。我还没有尝试过使用while循环遍历HoA。这两个循环并不等价。选项2不会打印数组的内容。@Borodin修复了它,我意识到我需要使用数组中的每个元素作为一个键,所以我可能仍然需要使用嵌套循环。听起来你应该使用一个数据库。你的基准告诉你什么?目前我有一个子程序,我在一个大型HoA中使用嵌套循环(选项1)。使用嵌套for循环,子例程运行大约需要5-12秒。我还没有尝试过使用while循环遍历HoA。这两个循环并不等价。选项2不会打印数组的内容。@Borodin修复了它,但是,我意识到我需要使用数组的每个元素作为键,所以我可能仍然需要使用嵌套循环。听起来你应该使用数据库。你能看看我在这之前问的问题吗?关于比较散列的那个。谢谢你能看看我在这之前问的问题吗?关于比较散列的那个。谢谢