gpt4 book ai didi

arrays - Perl - 有效区分超大数组的最佳实践

转载 作者:行者123 更新时间:2023-12-02 01:08:17 29 4
gpt4 key购买 nike

在这里寻求建议。我是 Perl 的新手,正在寻找以最快的方式执行两个数组之间的差异的输入。

我试图找出@arr_1 中存在但@arr_2 中不存在的差异。

这两个数组会很大,它们可能包含 6,000 到 8,000 个元素,这些元素将包含唯一数据,数组中的数据类型为 INT。由于这些数组的大小,差异将需要快速且不占用 CPU。

这是我用过的代码,我的问题是是否有更快的方法对 CPU 占用更少?

找出不同点

    my %diff3;    
@diff3{ @arr_1 } = @arr_1;
delete @diff3{ @arr_2};
@diff = (keys %diff3);

在此先感谢您,一旦我加快了 Perl 的速度,我期待着返回它。

最佳答案

给定两个包含大约 8k 个唯一整数元素的数组,考虑使用散列和 grep 来查找 @arr_1 中不在 @arr_2< 中的元素.

模块Benchmark可用于使用模块 Set::Scalar 比较此任务的时间, List::Compare 、您的解决方案、散列和 grep:

use strict;
use warnings;
use Set::Scalar;
use List::Compare;
use Benchmark qw/cmpthese/;

my @arr_1 = 0 .. 8e3;
my @arr_2 = 2e3 .. 1e4;

sub setScalar {
my $s1 = Set::Scalar->new(@arr_1);
my $s2 = Set::Scalar->new(@arr_2);
my $diff = $s1->difference($s2);
}

sub listCompare {
my $lc = List::Compare->new( \@arr_1, \@arr_2 );
my @diff = $lc->get_Lonly;
}

sub OPdiff {
my %diff3;
@diff3{@arr_1} = @arr_1;
delete @diff3{@arr_2};
my @diff = ( keys %diff3 );
}

sub hash_grep {
my %arr_2_hash;
undef @arr_2_hash{@arr_2};
my @diff = grep !exists $arr_2_hash{$_}, @arr_1;
}

cmpthese(
-5,
{
setScalar => sub { setScalar() },
listCompare => sub { listCompare() },
OPdiff => sub { OPdiff() },
hash_grep => sub { hash_grep() }
}
);

输出:

              Rate   setScalar listCompare      OPdiff   hash_grep
setScalar 9.58/s -- -69% -98% -98%
listCompare 31.1/s 225% -- -92% -94%
OPdiff 396/s 4034% 1172% -- -21%
hash_grep 500/s 5119% 1506% 26% --

Benchmark 的结果从最慢到最快显示。对于这个 diff 任务,很明显使用散列和 grep 是最快的,比您的解决方案快 1.3 倍,比 List::Compare 快 15 倍,并且>比 Set::Scalar 快 51 倍。

希望这对您有所帮助!

关于arrays - Perl - 有效区分超大数组的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20185044/

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