第一個問題兩個怪效率問題
我已超時需要多長時間來計算下面的語句(其中V [X]是一個耗時的函數調用):
Alice = Table[V[i],{i,1,300},{1000}];
Bob = Table[Table[V[i],{i,1,300}],{1000}]^tr;
Chris_pre = Table[V[i],{i,1,300}];
Chris = Table[Chris_pre,{1000}]^tr;
愛麗絲,鮑勃和克里斯是相同的基礎計算3種稍微不同的方式。我發現Chris的計算速度比Alice和Bob快1000倍。
愛麗絲計算速度降低1000倍並不奇怪,因爲天真地說,函數V必須比計算克里斯時多1000倍。但是Bob的速度真的很慢,因爲他的計算方式是,與Chris的區別在於Chris除了存儲中間步驟Chris_pre外。
爲什麼鮑勃評估這麼慢?
第二個問題
假設我要編譯一個函數在數學形式的
f(x)=x+y
,其中「y」爲固定在編譯時的恆定(但我不喜歡直接用代碼替換它的數字,因爲我希望能夠輕鬆地更改它)。如果y的實際值是y = 7.3,並且我定義了
f1=Compile[{x},x+y]
f2=Compile[{x},x+7.3]
然後f1運行比f2慢50%。當我編譯f1時,如何讓Mathematica用「7.3」代替「y」,這樣f1的運行速度與f2一樣快?
編輯:
我發現了一個醜陋的解決辦法對於第二個問題:
f1=ReleaseHold[Hold[Compile[{x},x+z]]/.{z->y}]
必須有一個更好的辦法...
哇,非常感謝!這正是我所期待的。 (我將確保在將來單獨發佈這樣的問題。) – 2010-05-01 17:54:22
使用With With可能是解決問題二的最安全的方法,因爲它在對其身體進行任何評估之前都會進行真正的詞彙替換。 – 2010-05-05 05:10:06
@邁克爾皮拉特:同意。如果你已經定義了'y',我建議使用快速和骯髒的方法進行評估,但臨時的額外變量肯定更安全。 – Cascabel 2010-05-06 14:26:25