perl 排序功能效率

bab*_*bno 1 sorting perl

我将大约 40,000 个字符串(每个大约 50 个字符)导入到一个数组中,然后我需要对其进行排序。最初我打算进行合并排序,但后来我意识到 perl 中有一个内置的排序函数。内置排序函数的效率如何,我可能期望它的运行时间是多少?如果您认为它可能会超过几分钟,我将采用合并排序方式,并希望您能提供任何好的示例。

And*_*ter 6

您不太可能编写出比过去几十年优化的 Perl 内置排序更快的排序。

不可能说出您可能期望什么样的运行时,因为我们对您的机器一无所知,但是您可以自己尝试内置排序,看看它是如何运行的,然后再担心是否更快。过早的优化是万恶之源。

这是我放在一起的测试程序。在我的 Macbook 上对 500,000 个字符串进行排序需要 0.47 秒(是您排序的 10 倍)。

$ cat foo.pl
#!/usr/bin/perl

use warnings;
use strict;
use 5.010;

use Time::HiRes qw( gettimeofday tv_interval );

my $nrecs = 500_000;

my @strings = map { random_string() } 1 .. $nrecs;

my $t0 = [gettimeofday];
my @sorted = sort @strings;

my $elapsed = tv_interval( $t0 );

say "Took $elapsed to sort $nrecs strings";

sub random_string {
    my @chars = ( 'a'..'z', 'A'..'Z' );
    return join( '', map { $chars[rand @chars] } 1..10 );
}

$ perl foo.pl
Took 0.474914 to sort 500000 strings
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 5

即使生成和打印所有字符串,以下在我的笔记本电脑上花费的时间不到半秒。

#! /usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

my @array = map {
    join "", map chr(32 + rand 95), 1 .. 50
} 1 .. 40_000;

my @sorted = sort @array;
say for @sorted;
Run Code Online (Sandbox Code Playgroud)

所以,不要担心性能,也不要费心自己实现排序。