我正在Ipython中准备一个小小的演示文稿,我想展示在Julia中进行并行操作是多么容易.
它基本上是这里描述的蒙特卡罗Pi计算
问题是我无法在IPython(Jupyter)笔记本中并行工作,它只使用一个.
我开始朱莉娅: julia -p 4
如果我在REPL中定义函数并在那里运行它可以正常工作.
@everywhere function compute_pi(N::Int)
"""
Compute pi with a Monte Carlo simulation of N darts thrown in [-1,1]^2
Returns estimate of pi
"""
n_landed_in_circle = 0
for i = 1:N
x = rand() * 2 - 1 # uniformly distributed number on x-axis
y = rand() * 2 - 1 # uniformly distributed number on y-axis
r2 = x*x + y*y # radius squared, in radial coordinates
if r2 < 1.0 …Run Code Online (Sandbox Code Playgroud) 我很确定这必须是一个bug ...
好吧,基本上,当我将一个Math Constant类型传递给power(^)函数并多次迭代时......循环非常慢并且使用了大量的内存分配.这个例子是微不足道的,因为它不会产生任何结果,但我有真正的应用程序,我有这个问题.
function test1(N)
for i = 1:N
x = pi^4
end
end
function test2(N)
for i = 1:N
x = pi*pi*pi*pi
end
end
function test3(N)
pif = float64(pi)
for i = 1:N
x = pif^4
end
end
Run Code Online (Sandbox Code Playgroud)
这是用大N调用函数的结果:
@time test1(10000000)
@time test2(10000000)
@time test3(10000000)
elapsed time: 0.958278949 seconds (320000160 bytes allocated, 56.44% gc time)
elapsed time: 6.341e-6 seconds (80 bytes allocated)
elapsed time: 4.982e-6 seconds (80 bytes allocated)
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?或者它有合理的解释吗?在大循环中为pi提供动力的正确方法是什么?
谢谢.
好的,我最近正在进行一系列测试.我有一个MC模拟,我有几个变量(20),将它们全部放在一维数组中是有意义的,因为它使几个更容易阅读.
但是我有一个问题,我需要在每次迭代中对变量求和,并且模拟需要大量的迭代,所以我遇到了这个问题(减少到7个变量):
function sumtest1(N)
s=0.0
a=1.0
b=2.0
c=3.0
d=4.0
e=5.0
f=6.0
g=7.0
for i = 1:N
s += (a+b+c+d+e+f+g)
end
return s
end
function sumtest2(N)
s=0.0
A=[1.0,2.0,3.0,4.0,5.0,6.0,7.0]
for i = 1:N
s += sum(A)
end
return s
end
@time sumtest1(1_000_000_000)
elapsed time: 0.998272756 seconds (96 bytes allocated)
@time sumtest1(1_000_000_000)
elapsed time: 7.522198967 seconds (208 bytes allocated)
Run Code Online (Sandbox Code Playgroud)
这是预期的吗?或者我做错了什么?我真的希望将我的变量编入索引,因为其他原因现在解释的时间太长了,但这种性能损失是我无法忍受的.
有没有办法“元编程”获得具有以下结构的代码块:
if r1 < R1
s = 1
elseif r1 < R2
s = 2
... etc until N
end
end
Run Code Online (Sandbox Code Playgroud)
谢谢!
让我们假设我有3个变量R1,R2和R3.我想要一个指向变量的Dictionary(或其他集合),这样如果我修改变量,它也会改变Dictionary中的值.
基本上我想做这样的事情:
R1 = 0.0
R2 = 0.0
R3 = 0.0
D = Dict(1=>R1, 2=>R2, 3=>R3)
D[1]
output> 0.0
R1 = 1.0
D[1]
output> 1.0
Run Code Online (Sandbox Code Playgroud)
在朱莉娅有办法做到这一点吗?
谢谢
我正在尝试加速以下代码:
from math import log
from random import random
def logtest1(N):
tr=0
for i in range(1,N):
T= 40 + 10*random()
tr += -log(random())/T
Run Code Online (Sandbox Code Playgroud)
我是python的新手(来自matlab)...而这个相同的代码在python中运行速度比matlab(和Julia)慢5倍,这引起了我的注意.
我尝试使用numba和一个长尾小鹦鹉包装器,而不是python的numpy函数,但根本没有任何改进.
我很感激任何帮助.谢谢.
编辑:整个事情是蒙特卡罗模拟,所以N非常大... 10e6用于测试目的
julia ×5
performance ×2
arrays ×1
collections ×1
constants ×1
constructor ×1
jupyter ×1
logarithm ×1
matlab ×1
pointers ×1
python ×1
sum ×1