[英]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.