[英]Can I Initialize an Array to a Given Size in Perl?
我的代码中有一个部分,我知道我需要一个数组,而且我确切地知道该数组需要有多少个元素。 这部分代码将重复很多,所以我可以节省一些非常大的时间,首先将该数组初始化为我知道它需要的大小,然后填充它而不仅仅推送项目(推送将是O( n)而不是填充已经创建的空间,这将是O(1))。
也就是说,我似乎无法找到任何优雅的方法将数组初始化为给定的大小,我不知道为什么。 我知道我能做到:
my @array; $array[49] =0;
得到一个50项阵列,但这对我来说真的很难看,我觉得必须有一个更好的方法。 想法?
说实话,你的方式非常好,因为显式改变了数组的大小: $#array = 49;
;
在你去之前测量,测量,测量并假设你可以通过伪造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.