gpt4 book ai didi

performance - 如何优化此 perl sub 的速度?

转载 作者:行者123 更新时间:2023-12-01 07:13:33 25 4
gpt4 key购买 nike

以下 perl sub 用于存储哈希数组。每个要存储的散列首先使用给定的键检查唯一性,如果数组中存在具有相同键值的散列,则不存储它。

如何优化此 perl 子程序以提高速度?

使用示例:

my @members;
...
$member= {};
$hash->{'name'}='James';
hpush('name', \@members,$member);

潜艇:

sub hpush {
# push a set of key value pairs onto an array as a hash, if the key doesn't already exist
if (@_ != 3) {
print STDERR "hpush requires 3 args, ".@_." given\n";
return;
}

my $uniq = shift;
my $rarray = shift;
my $rhash = shift;
my $hash = ();

#print "\nHash:\n";
for my $key ( keys %{$rhash} ) {
my $valuea = $rhash->{$key};

#print "key: $key\n";
#print "key=>value: $key => $valuea\n";
$hash->{ $key} = $valuea;
}

#print "\nCurrent Array:\n";
for my $node (@{$rarray}) {
#print "node: $node \n";
for my $key ( keys %{$node} ) {
my $valueb = $node->{$key};
#print "key=>value: $key => $valueb\n";
if ($key eq $uniq) {
#print "key=>value: $key => $valueb\n";
if (($valueb =~ m/^[0-9]+$/) && ($hash->{$key} == $valueb)) {
#print "Not pushing i $key -> $valueb\n";
return;
} elsif ($hash->{$key} eq $valueb) {
#print "Not pushing s $key -> $valueb\n";
return;
}
}
}
}
push @{$rarray}, $hash;
#print "Pushed\n";

}

请注意,perl 不是我的,我是 perl 初学者

最佳答案

这段代码相当……效率不高。首先,它将 $rhash 复制到 $hash,使用 for 循环...出于某种原因。然后它遍历散列键,而不是简单地使用它正在寻找的散列键。然后它进行两个等价的检查,显然是一些尝试将数字与非数字区分开来并选择适当的检查(==eq)。这都是不必要的。

下面这段代码应该大致相同。我已经很努力地修剪它了。这应该尽可能快地完成。

use strict;
use warnings;

hpush('name', \@members,$member);

sub hpush {
my ($uniq, $rarray, $rhash) = @_;

for my $node (@{$rarray}) {
if (exists $node->{$uniq}) {
return if ($node->{$uniq} eq $rhash->{$uniq});
}
}
push @{$rarray}, $rhash;
}

关于performance - 如何优化此 perl sub 的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6997582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com