2 回答

TA貢獻1895條經(jīng)驗 獲得超7個贊
不錯的作品。有趣的比較你已經(jīng)到了那里。作為一名 python 開發(fā)人員,我想添加一些關于 Python 的額外視圖。
我認為它較慢主要是因為動態(tài)類型。另一個原因是您正在計算標量值(即使用 for 循環(huán)并一次計算一個數(shù)字)。Python 的優(yōu)點之一是使用 NumPy 庫的向量計算(這允許同時計算多個數(shù)字)。所以,這是我的算法實現(xiàn)。注意:我使用的是 python 3.6。
import numpy as np
import time
start = time.time()
events = int(1e8)
nThrows, nSuccess = 0, 0
x, y = np.random.uniform(size=(2, events))
nSuccess = (x*x + y*y <= 1).sum()
nThrows = events
pi = 4*nSuccess/float(nThrows)
stop = time.time()
print('Time: {}, Pi = {}'.format(stop-start, pi))
以下是我的 i7 x64 計算機 (Windows 10) 上的基準測試結果:
Python (original code): 42.6s Pi = 3.1414672
Python (my optimized code): 4.7s Pi = 3.1417642
如您所見,在我的計算機上運行的原始 python 代碼比您計算機上的 python 代碼慢。因此,優(yōu)化后的版本可能比 Java 或 Groovy 更快。
希望這可以幫助。

TA貢獻1840條經(jīng)驗 獲得超5個贊
對于 Julia 代碼,您在基準測試中包含編譯時間。另一件需要注意的事情是您正在使用全局變量,眾所周知這會降低性能。使用您的基準版本,我的機器上的執(zhí)行時間是 17.7 秒。將所有內容移到一個函數(shù)中,我得到了 0.83 秒。從中刪除編譯時間使我降至 713.625 毫秒。我的代碼的最終版本是這個(注意你在循環(huán)中計算了一個太多)。
using Random
using BenchmarkTools
function benchmark()
nThrows = 0
nSuccess = 0
events = 100_000_000
for j in 1:events
x = rand() # Throw a dart
y = rand()
nThrows += 1
if x^2 + y^2 <= 1
nSuccess += 1
end
end
4.0*nSuccess/nThrows
end
pi = @btime benchmark()
println( "Pi = ", pi)
請注意,進一步的改進是可能的。在循環(huán)之外分配一個隨機數(shù)數(shù)組而不是每次迭代調用 rand 兩次可能是有益的。您可以在此處找到其他性能提示:https ://docs.julialang.org/en/v1/manual/performance-tips/
添加回答
舉報