簡體   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