perl 排序函数效率
perl sort function efficiency
我将大约 40,000 个字符串导入一个数组,每个字符串大约 50 个字符,然后我需要对其进行排序。最初我打算进行合并排序,但后来我意识到 perl 中有一个内置的排序函数。内置排序函数的效率如何?我希望它能运行多长时间?如果您认为这可能会超过几分钟,我将采用合并排序的方式,如果您能提供任何好的示例,我将不胜感激。
您不太可能编写比过去几十年优化的 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
即使生成并打印所有字符串,以下内容在我的笔记本电脑上花费的时间也不到半秒。
#! /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;
所以,不要担心性能,也不要费心自己实现排序。
我将大约 40,000 个字符串导入一个数组,每个字符串大约 50 个字符,然后我需要对其进行排序。最初我打算进行合并排序,但后来我意识到 perl 中有一个内置的排序函数。内置排序函数的效率如何?我希望它能运行多长时间?如果您认为这可能会超过几分钟,我将采用合并排序的方式,如果您能提供任何好的示例,我将不胜感激。
您不太可能编写比过去几十年优化的 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
即使生成并打印所有字符串,以下内容在我的笔记本电脑上花费的时间也不到半秒。
#! /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;
所以,不要担心性能,也不要费心自己实现排序。