我可以在Perl中将数组初始化为给定大小吗?

Eli*_*Eli 19 perl

我的代码中有一个部分,我知道我需要一个数组,而且我确切地知道该数组需要有多少个元素.这部分代码将重复很多,所以我可以节省一些非常大的时间,首先将该数组初始化为我知道它需要的大小然后填充它而不仅仅推送项目(推送将是O( n)而不是填充已经创建的空间,这将是O(1)).

也就是说,我似乎无法找到任何优雅的方法将数组初始化为给定的大小,我不知道为什么.我知道我能做到:

my @array; $array[49] =0;

得到一个50项阵列,但这对我来说真的很难看,我觉得必须有一个更好的方法.想法?

DVK*_*DVK 14

说实话,你的方式是完全正常的,作为被明确改变数组的大小:$#array = 49;;

  • 如果元素也需要初始化,请使用`my @ array =(0)x50` (14认同)

And*_*ter 13

  1. 优化俱乐部的第一条规则是,您不优化.
  2. 优化俱乐部的第二条规则是,如果不进行测量,则不进行优化.

在你去之前测量,测量,测量并假设你可以通过伪造Perl来更快地完成它.Perl一直在进行常规使用的优化,比你拥有的时间长得多.相信它.

  • 这个“规则”一直被滥用。“过早优化是万恶之源”已经变成了“优化是万恶之源”。因此,应该避免优化。因此,这些工程师在软件设计过程中不会考虑应用程序性能,而这恰恰是至关重要的。最初的引用主要是关于微观优化。 (2认同)

Bri*_*ian 6

每当您考虑进行此类优化时,请进行一些分析!结果可能不是您所期望的.例如,我使用以下快速脚本来测试您的理论,即预先分配数组的速度更快:

for ( my $loops = 0; $loops < 100000; $loops++ )
{
    my @arr;

    for ( my $foo = 0; $foo < 50; $foo++ ) {
        push @arr, 'bar';
    }
}
Run Code Online (Sandbox Code Playgroud)

这需要2.13秒.

for ( my $loops = 0; $loops < 100000; $loops++ )
{
    my @arr;
    $arr[49] = 0;

    for ( my $foo = 0; $foo < 50; $foo++ ) {
        $arr[$foo] = 'bar';
    }
}
Run Code Online (Sandbox Code Playgroud)

花了2.16秒(我跑了两次测试).所以它实际上最终被更快只是让Perl来处理数组分配是必要的.

更新

在通过ysth建议进行更改后,数字更有意义:"推"方法为2.27秒,预分配为2.21秒.即使这样,我也会质疑这样的优化是否真的可以节省任何时间(100,000次迭代后差异仅为0.06秒).