我的代码中有一个部分,我知道我需要一个数组,而且我确切地知道该数组需要有多少个元素.这部分代码将重复很多,所以我可以节省一些非常大的时间,首先将该数组初始化为我知道它需要的大小然后填充它而不仅仅推送项目(推送将是O( n)而不是填充已经创建的空间,这将是O(1)).
也就是说,我似乎无法找到任何优雅的方法将数组初始化为给定的大小,我不知道为什么.我知道我能做到:
my @array; $array[49] =0;
得到一个50项阵列,但这对我来说真的很难看,我觉得必须有一个更好的方法.想法?
And*_*ter 13
在你去之前测量,测量,测量并假设你可以通过伪造Perl来更快地完成它.Perl一直在进行常规使用的优化,比你拥有的时间长得多.相信它.
每当您考虑进行此类优化时,请进行一些分析!结果可能不是您所期望的.例如,我使用以下快速脚本来测试您的理论,即预先分配数组的速度更快:
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秒).
| 归档时间: |
|
| 查看次数: |
21910 次 |
| 最近记录: |