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

标签 arrays perl key diff

在这里寻求建议。我是 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/

相关文章:

java - 根据条件从另一个 Spinner 填充 Spinner

perl - linux中有类似lsof命令的perl函数吗?

regex - PCRE正则表达式删除空大括号

linux - 如何将环境设置导入我的 Perl 程序?

java - TreeMap put() 静默删除其他条目?

具有二维数组的 Java 可变参数

javascript - 副作用/更改传递给函数的全局变量

javascript - 矫枉过正?使用indexOf()来发现字符串的内容

c# - 按键获取字典值

key - Hazelcast 分区的所有者和副本?该分区包含哪些键?