2 回答
TA贡献1895条经验 获得超7个赞
不错的作品。有趣的比较你已经到了那里。作为一名 python 开发人员,我想添加一些关于 Python 的额外视图。
我认为它较慢主要是因为动态类型。另一个原因是您正在计算标量值(即使用 for 循环并一次计算一个数字)。Python 的优点之一是使用 NumPy 库的向量计算(这允许同时计算多个数字)。所以,这是我的算法实现。注意:我使用的是 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 代码慢。因此,优化后的版本可能比 Java 或 Groovy 更快。
希望这可以帮助。
TA贡献1840条经验 获得超5个赞
对于 Julia 代码,您在基准测试中包含编译时间。另一件需要注意的事情是您正在使用全局变量,众所周知这会降低性能。使用您的基准版本,我的机器上的执行时间是 17.7 秒。将所有内容移到一个函数中,我得到了 0.83 秒。从中删除编译时间使我降至 713.625 毫秒。我的代码的最终版本是这个(注意你在循环中计算了一个太多)。
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)
请注意,进一步的改进是可能的。在循环之外分配一个随机数数组而不是每次迭代调用 rand 两次可能是有益的。您可以在此处找到其他性能提示:https ://docs.julialang.org/en/v1/manual/performance-tips/
添加回答
举报
