第二次编辑: github上的这个拉取请求将解决问题.只要有人运行Julia v0.5 +,匿名函数就会像常规函数一样快.案件已经结案.
编辑:我已经将问题和函数定义更新为更一般的情况.
举一个简单的例子,当函数传递函数或在函数中定义函数时,Julia编译器似乎不会优化.这让我感到惊讶,因为这在优化包中非常普遍.我是正确还是我做了一些愚蠢的事情?一个简单的例子如下:
f(a::Int, b::Int) = a - b #A simple function
function g1(N::Int, fIn::Function) #Case 1: Passing in a function
z = 0
for n = 1:N
z += fIn(n, n)
end
end
function g2(N::Int) #Case 2: Function defined within a function
fAnon = f
z = 0
for n = 1:N
z += fAnon(n, n)
end
return(z)
end
function g3(N::Int) #Case 3: Function not defined within function
z = 0
for n …Run Code Online (Sandbox Code Playgroud) 我想知道朱莉娅的不变类型和表演.
在哪种情况下,使复合类型不可变提高性能?文件说
在某些情况下,它们更有效.上面的Complex示例之类的类型可以有效地打包到数组中,在某些情况下,编译器可以避免完全分配不可变对象.
我真的不明白第二部分.
是否存在使复合类型不可变降低性能的情况(超出需要通过引用更改字段的情况)?我想一个例子可能是当一个不可变类型的对象被重复用作参数时,因为
具有不可变类型的对象通过复制传递(在赋值语句和函数调用中),而可变类型通过引用传递.
但是,我在一个简单的例子中找不到任何区别:
abstract MyType
type MyType1 <: MyType
v::Vector{Int}
end
immutable MyType2 <: MyType
v::Vector{Int}
end
g(x::MyType) = sum(x.v)
function f(x::MyType)
a = zero(Int)
for i in 1:10_000
a += g(x)
end
return a
end
x = fill(one(Int), 10_000)
x1 = MyType1(x)
@time f(x1)
# elapsed time: 0.030698826 seconds (96 bytes allocated)
x2 = MyType2(x)
@time f(x2)
# elapsed time: 0.031835494 seconds (96 bytes allocated)
Run Code Online (Sandbox Code Playgroud)
那么为什么f不变的类型不慢?是否存在使用不可变类型使代码变慢的情况?
正如标题所述:@parallel和之间究竟有什么区别pmap?我并不是说明显的一个是循环的宏而另一个是关于函数的,我的意思是他们的实现究竟是如何不同的,我应该如何使用这些知识在它们之间进行选择?
我问的原因是我写的很多应用程序都可以使用任何一个构造:我可以编写一个循环并用它来计算@parallel,或者将循环中的内容包装到函数中并调用pmap它.我一直在遵循使用@parallel快速评估的内容和pmap每个任务需要更长时间的调用的建议(如文档中所述),但我觉得如果我能更好地理解它正在做什么我会能够做出更好的选择.
例如:@parallel在评估之前是否将工作分开?我注意到如果我运行一个并行循环,其中每个内部调用需要一个随机的时间,@parallel可能需要很长时间,因为最后我只有很少的进程仍在工作.pmap在相同的微型测试中似乎没有这个:是否pmap根据需要重新分配工作?
像这样的其他问题都源于我对pmap不同之处的无知@parallel.
我正在尝试使用 Google Colab 设置 Julia。已遵循https://discourse.julialang.org/t/julia-on-google-colab-free-gpu-accelerated-shareable-notebooks/15319 中的安装说明。尽管如此,我还是无法启动 Julia。
我正在尝试将 Julia 与 Google Colab 一起使用。我按照以下步骤操作:
!wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
!dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64-deb
!apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
!apt update -q
!apt install cuda gcc-6 g++-6 -y -q
!ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc
!ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++
Run Code Online (Sandbox Code Playgroud)
!curl -sSL "https://julialang-s3.julialang.org/bin/linux/x64/1.2/julia-1.2.0-linux-x86_64.tar.gz" -o julia.tar.gz
!tar -xzf julia.tar.gz -C /usr --strip-components 1
!rm -rf julia.tar.gz*
!julia -e 'using Pkg; pkg"add IJulia; add CuArrays; add Flux; precompile"'
Run Code Online (Sandbox Code Playgroud)
以上两个步骤运行得很好。我无法启动 Julia 会话。我试过:
!julia
Run Code Online (Sandbox Code Playgroud)
这样,Julia 启动屏幕将继续显示而没有命令行。
我想知道如何使用Julia作为解释器在VS Code 中运行Jupyter Notebook?我想使用这个包中的变量检查器/资源管理器,但我无法让它工作。有没有更简单的方法来实现它们?喜欢 Python?总之像这里?
我想从这个站点中提取大学及其网站的名称到列表中。
在 Python 中,我使用 BeautifulSoup v4 做到了:
import requests
from bs4 import BeautifulSoup
import pandas as pd
page = requests.get('https://thebestschools.org/features/best-computer-science-programs-in-the-world/')
content = BeautifulSoup(page.text, 'html.parser')
college_name = []
college_link = []
college_name_list = content.find_all('h3',class_='college')
for college in college_name_list:
if college.find('a'):
college_name.append(college.find('a').text)
college_link.append(college.find('a')['href'])
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢用 Julia 编程,因为它与 Python 非常相似,我想知道我是否也可以在 Julia 中进行网络抓取。任何帮助,将不胜感激。
我正在ord(char)为 Julia寻找类似 Python 的东西,它返回一个整数。
我想A按第2列和第3列对我的矩阵进行排序.
A = round(randn(100,4))
Run Code Online (Sandbox Code Playgroud)
也许是这样的:
sort(A,(0,2:3))
100x4 Array{Float64,2}:
0.0 -2.0 -2.0 -1.0
-1.0 -2.0 -1.0 1.0
1.0 -2.0 -1.0 2.0
-1.0 -2.0 0.0 0.0
-1.0 -2.0 0.0 -1.0
-0.0 -2.0 0.0 -1.0
1.0 -2.0 0.0 0.0
1.0 -2.0 1.0 -1.0
-0.0 -2.0 2.0 -1.0
-0.0 -1.0 -2.0 1.0
?
-0.0 1.0 0.0 1.0
1.0 1.0 1.0 1.0
0.0 1.0 1.0 -1.0
-0.0 1.0 2.0 0.0
-0.0 2.0 -1.0 0.0
-2.0 2.0 -1.0 1.0
2.0 2.0 -0.0 -1.0
-1.0 …Run Code Online (Sandbox Code Playgroud) 该朱莉娅风格指南说以下内容:
不要使用不必要的静态参数.功能签名:
Run Code Online (Sandbox Code Playgroud)foo{T<:Real}(x::T) = ...应该写成:
Run Code Online (Sandbox Code Playgroud)foo(x::Real) = ...
我希望也适用于数组参数.但是,如果我写下面的代码:
ret1(x::Real) = x
ret2(x::Array{Float64,2}) = x
ret3(x::Array{Real,2}) = x
ret1(1.0)
ret2(rand(2,2))
ret3(rand(2,2))
Run Code Online (Sandbox Code Playgroud)
然后我得到以下控制台输出(使用Julia 0.2.1):
MethodError(ret3,(
2x2 Array{Float64,2}:
0.841121 0.322133
0.469432 0.495438,))
Run Code Online (Sandbox Code Playgroud)
那么为什么Julia会为具有抽象类型参数的数组抛出错误,而对于具有抽象类型的变量则不会?
Julia本身不支持多次返回.但是,Julia通过返回值元组来执行类似的功能,然后可以将其分配给变量元组.例如:
function mult_return()
(3,2)
end
Run Code Online (Sandbox Code Playgroud)
返回元组(3,2).然后我们可以将这两个返回值分配给不同的变量,如下所示:
(a,b) = mult_return()(或a,b = mult_return()因为括号不是必需的.)
我的问题是:有没有办法忽略其中一个返回值?例如,在Matlab语法中,用户可以编写:
[~, b] = mult_return()
Run Code Online (Sandbox Code Playgroud)
这样只将第二个值赋给变量.
在Julia中解决这个问题的正确方法是什么?