Performance Perl,如何使这个脚本更小、更快、更好、更强?

Performance Perl,如何使这个脚本更小、更快、更好、更强?,performance,perl,Performance,Perl,我是perl方面的新手,如何才能使它更好更快? (SPOJ任务) 直到($i>99){ $a=; 如果($a%5==0){ 如果($a%3==0){ 打印“Spokoko\n”; }否则{ 打印“SPOKO\n”; } }elsif($a%3==0){ 打印“KOKO\n”; }否则{ 打印“$a”; } $i++; } 可以被5和3整除的东西可以被15整除,所以你的逻辑更直截了当 可被15整除的 可被5整除的 可被3整除的 不能被5或3整除 我也会利用这个机会 我也会将笨拙的直到替换为的,

我是perl方面的新手,如何才能使它更好更快? (SPOJ任务)

直到($i>99){
$a=;
如果($a%5==0){
如果($a%3==0){
打印“Spokoko\n”;
}否则{
打印“SPOKO\n”;
}
}elsif($a%3==0){
打印“KOKO\n”;
}否则{
打印“$a”;
}
$i++;
}

可以被5和3整除的东西可以被15整除,所以你的逻辑更直截了当

  • 可被15整除的
  • 可被5整除的
  • 可被3整除的
  • 不能被5或3整除
我也会利用这个机会

我也会将笨拙的
直到
替换为的
,而不必为$I操心

避免使用$a和$b,因为它们是所使用的特殊变量

打开

把这条新线从一美元中去掉。从技术上讲,如果你打算把它作为一个数字使用,就没有必要了,但如果你不打印,它会有一个额外的换行符

非数字
%
任何东西都是0。除非我们验证输入,否则如果您不输入任何内容或输入“香蕉”,您将得到
spokoko
。我们可以检查输入是否像Perl认为的数字一样。如果它不是一个数字,抛出一个异常;函数的任务不是找出如何处理非数字。Perl实际上没有例外,但我们可以使用
die
eval
来接近它

并将逻辑放入子例程中。这将输入和输出的细节与逻辑分离。现在可以命名、记录、测试和重用逻辑。这也避免了冗余的
,比如说

use strict;
use warnings;
use Scalar::Util qw(looks_like_number);
use v5.10;

sub whatever_this_is_doing {
  my $num = shift;

  # Validate input early to keep the rest of the logic simple.
  if( !looks_like_number($num) ) {
    die "'$num' is not a number";
  }

  if($num % 15 == 0) {
    "SPOKOKOKO";
  }
  elsif($num % 5 == 0) {
    "SPOKO";
  }
  elsif($num % 3 == 0) {
    "KOKO";
  }
  else {
    $num;  # Note there's no need to quote a single variable.
  }
}

for(1..99) {
  my $num = <>;
  chomp($num);

  eval {
    say whatever_this_is_doing($num);
  } or say "'$num' is not a number.";
}
使用严格;
使用警告;
使用Scalar::Util qw(看起来像数字);
使用v5.10;
不管你在干什么{
我的$num=shift;
#尽早验证输入以保持其余逻辑的简单性。
如果(!看起来像数字($num)){
骰子“'$num'不是一个数字”;
}
如果($num%15==0){
“斯波科科”;
}
elsif($num%5==0){
“斯波科”;
}
elsif($num%3==0){
“科科”;
}
否则{
$num;#注意不需要引用单个变量。
}
}
对于(1..99){
我的$num=;
chomp($num);
评估{
说这是做什么($num);
}或者说“$num”不是一个数字。”;
}

我确信有一些非常聪明的数学方法可以减少对
%
的调用,但是
%
不太可能成为瓶颈,特别是在Perl中,所以我将它留在那里。

100行?这将是如此之快,我不明白你为什么要求优化。然而

最大的两个成本是读100行和写100行

然后是ifs和模检验——每一个都是无关紧要的

要考虑的一件事是把它翻出来。我建议1
print
在循环中使用一个混乱的表达式

print  ( ($a%5 == 0) ?
            ( ($a%3 == 0) ? "SPOKOKOKO\n" : "SPOKO\n" ) :
            ( ($a%3 == 0) ? "KOKO\n"      : $a        );
更少的线(3对10);可能更容易阅读(尤其是列对齐时);也许更快

容易消化。(我没有注意到,
%3
是一样的。)哦,现在很明显,
\n
在上一个案例中丢失了;也许是虫子


也许可以删除一些括号,但我不相信Perl会“对
的嵌套使用做正确的事情”:

在从STDIN读取时,应该删除尾随的换行符,使用
chomp($a=)
。因此,当前脚本的工作情况与您预期的一样?你只想复习一下?那么你应该问得更快,因为读起来不一定更容易。更优雅不一定更快,也不一定更容易阅读。如果你正在面试一份工作,首先要解决易读性问题。如果面试官希望你在其他方面进行优化,请澄清可接受的权衡。此外,避免直到。它没有被大量使用,并且可能会被扣分,让下一个出现的人思考它在做什么,而不是在做什么。此外,这几乎是经典的fizzbuzz问题,除了它不从1-100计算,它迭代100次,但每次都在STDIN上等待另一个数字来处理。我几乎想知道你是否误解了他们的要求,在每次迭代中都会从STDIN中读取代码。你的第一个脚本(
for(1..100){$a=;if($a%5==0){if($a%3==0){print“spokokokoko\n”;}else{print“SPOKO\n”}elsif($a%3==0){print“ko n”;}
)我得了131分,新的分数只有577分(越小越好)这很复杂:c@Suchy如果你正在使用某个特定的评分系统,请将其包含在你的问题中。我不知道“SPOJ”是什么。这可能比不使用英语更好,我认为最短代码=更好(在这个评分系统中)。
print  ( ($a%5 == 0) ?
            ( ($a%3 == 0) ? "SPOKOKOKO\n" : "SPOKO\n" ) :
            ( ($a%3 == 0) ? "KOKO\n"      : $a        );