perl – 查找列表中最长元素的最快方式(执行时间)

前端之家收集整理的这篇文章主要介绍了perl – 查找列表中最长元素的最快方式(执行时间)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是找到列表中最长的元素的最快(执行时间)方式吗?
#!/usr/bin/env perl
use warnings;
use 5.012;
use List::Util qw(reduce);
use List::Util::XS;

my @array = qw( one two three four five six seven eight nine ten eleven );

my $l = reduce{ length($a) > length($b) ? $a : $b } @array;

say $l;

解决方法

当只尝试找到一个列表的一个元素时,不需要构建一个N大小的数据结构,这里的许多答案已经完成.最快的O(N)方法是走数组,跟踪最大的元素.这样你有O(N)访问列表,和O(1)内存使用.
sub longest {
    my $max = -1;
    my $max_i = 0;
    for (0 .. $#_) {              # for each index
        my $len = length $_[$_];  # only get length once per item
        if ($len > $max) {        # save index and update max if larger
            $max = $len;
            $max_i = $_;
        }
    }
    $_[$max_i]   # return the largest item
}

如果你要运行上面的代码很多次,我建议嵌入子程序的正文.

编辑:

drewk的基准显示,上述代码中的数组索引有点瓶颈.再试一次,我终于找到了一种比reduce解决方案更快的方法

sub fastest {
    my $max = -1;
    my $max_ref;
    for (@_) {
        if (length > $max) {  # no temp variable,length() twice is faster
            $max = length;
            $max_ref = \$_;   # avoid any copying
        }
    }
    $$max_ref
}

这导致以下基准:

Rate longest   drewk  reduce fastest
longest 44245/s      --    -21%    -30%    -47%
drewk   55854/s     26%      --    -11%    -33%
reduce  63014/s     42%     13%      --    -25%
fastest 83638/s     89%     50%     33%      --

猜你在找的Perl相关文章