繁体   English   中英

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

[英]Can I Initialize an Array to a Given Size in Perl?

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

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

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

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

说实话,你的方式非常好,因为显式改变了数组的大小: $#array = 49; ;

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

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

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

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

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

这需要2.13秒。

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

    for ( my $foo = 0; $foo < 50; $foo++ ) {
        $arr[$foo] = 'bar';
    }
}

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

更新

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

而不是特定的值使用undef

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

你的方式很棒,DVK也是如此。 在单个命令中执行此操作的方法可能是:

@array = (0 .. 49);

但是我不确定它是否更优雅,因为它为每个元素分配了1到49之间的值,但对于程序员来说,理解Perl的语法可能更直观。

预分配可能对速度没有太大帮助,但是如果分配的块足够大,它可能有助于将内存返回到系统

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM