【问题标题】:perl sort function efficiencyperl排序函数效率
【发布时间】:2021-04-09 22:53:35
【问题描述】:

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

【问题讨论】:

  • 巧合的是,Perl 的sort 是一个合并排序:)
  • 你知道,你可以试试看。 :)

标签: sorting perl


【解决方案1】:

您不太可能编写出比 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

【讨论】:

    【解决方案2】:

    即使在生成和打印所有字符串的情况下,以下操作在我的笔记本电脑上也只需要不到半秒的时间。

    #! /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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多