Ruby中Array初始化的兩種不同方式之間的複雜性區別是什麼?Ruby中Array的兩種不同初始化方式之間的複雜性區別是什麼
我需要我的新數組初始化爲0
我可以做任何的方式:
newArray = Array.new(a,0)
或
newArray = Array.new(a){|i| i*0}
我需要知道時間之間的差如果有複雜性?
Ruby中Array初始化的兩種不同方式之間的複雜性區別是什麼?Ruby中Array的兩種不同初始化方式之間的複雜性區別是什麼
我需要我的新數組初始化爲0
我可以做任何的方式:
newArray = Array.new(a,0)
或
newArray = Array.new(a){|i| i*0}
我需要知道時間之間的差如果有複雜性?
有趣的問題。讓我們利用benchmark
模塊,看看這兩種變化是如何進行的。
Benchmark.realtime do |x|
10_000.times { Array.new(1000, 0) }
end
#=> 0.032521000131964684
Benchmark.realtime do |x|
10_000.times { Array.new(1000) { 0 } }
end
#=> 0.49374799989163876
正如您所看到的,第一個實現比塊初始化快n倍。根據Array.new
description,最後一種形式通過將元素的索引傳遞給塊並存儲返回值來填充每個元素。在這個版本中,應該有需要空間和CPU的中間變量創建和存儲。
if (rb_block_given_p()) {
long i;
if (argc == 2) {
rb_warn("block supersedes default value argument");
}
for (i=0; i<len; i++) {
rb_ary_store(ary, i, rb_yield(LONG2NUM(i)));
ARY_SET_LEN(ary, i + 1);
}
}
VS
ary_memfill(ary, 0, len, val);
ary_memfill
迭代在O(n)和設置值[ref]。 rb_ary_store
(在前)使用rb_ary_modify
這是它自己的一組計算。
'快n倍? 0.49374799989163876/0.032521000131964684約爲15. –
糟糕。並不意味着n在數組長度那裏。 – kiddorails
'{| i |我* 0}'完全沒有意義,因爲它與'{0}'相同。你是不是指'[0] * a'? – mudasobwa
是的,它與{0} – Sarthak
相同因此,'[0] * a'是相同的。 – mudasobwa