我試圖儘可能地簡化它。while循環比返回迭代器時更快
功能f1
和f2
通過Vector R
執行roulette wheel selection的非常簡化版本。他們之間的唯一區別是,f1
一段時間使用一個for和f2
。這兩個函數都返回符合條件的數組的索引。
R=rand(100)
function f1(X::Vector)
l = length(X)
r = rand()*X[l]
for i = 1:l
if r <= X[i]
return i
end
end
end
function f2(X::Vector)
l = length(X)
r = rand()*X[l]
i = 1
while true
if r <= X[i]
return i
end
i += 1
end
end
現在我創建了幾個測試功能... M
是的次數,我們重複此函數執行。
現在這是至關重要的...我想存儲我從函數中得到的值,因爲我稍後需要它們...爲了簡化代碼,我剛剛創建了一個新變量r
,其中我總結了函數的返回值。
function test01(M,R)
cumR = cumsum(R)
r = 0
for i = 1:M
a = f1(cumR)
r += a
end
return r
end
function test02(M,R)
cumR = cumsum(R)
r = 0
for i = 1:M
a = f2(cumR)
r += a
end
return r
end
所以,下次我得到:
@time test01(1e7,R)
elapsed time: 1.263974802 seconds (320000832 bytes allocated, 15.06% gc time)
@time test02(1e7,R)
elapsed time: 0.57086421 seconds (1088 bytes allocated)
所以,由於某種原因,我無法弄清楚f1
分配存儲了很多,它的更大的較大M
得到。 我說行r += a
是至關重要的,因爲如果我從兩個測試函數中刪除它,我得到了與兩個測試相同的結果,所以沒有問題!所以我認爲函數返回a
的類型有問題(因爲f1
返回for循環的迭代器,並且f2
在函數內部使用自己的變量i
「手動聲明」)。
但是......
aa = f1(cumsum(R))
bb = f2(cumsum(R))
typeof(aa) == typeof(bb)
true
所以......那是什麼到底是怎麼回事???
我很抱歉,如果這是一個基本的問題,但是,我已經超過了3個多小時,現在無法找到答案...即使函數是通過使用while循環討厭不知道發生了什麼事。
謝謝。
你的函數是不確定的,'f1'和'f2'都包含'r = rand()* X [l]',而'r'是停止標準。如果你想使時間公平,把'r'作爲參數,並創建一個不同'r'的矢量來測試速度。 –
'f2'跳過測試'X'向量的末尾。它節省了時間,但'X'中的不滿可能會導致Outbound Bound異常。另一方面'f1'可以在'for'語句之前添加'@ inbounds',因爲索引肯定是入站的。這些更改可降低版本之間的速度差異。 –
@DanGetz謝謝,我添加了@ @inbounds,速度差異減小了,但內存分配問題依然存在。 – Esteban