小编hja*_*jab的帖子

在Julia中,为什么函数的范围规则与其他第一类对象相比显得不一致?

Julia文档声明函数是第一类对象.我理解这意味着我应该能够像使用旧数据类型一样使用和定义它们.

因此,我很惊讶

function a(b::Int64)
    if b > 0
        c = 1
    else
        c = -1
    end
end
a(2)
Run Code Online (Sandbox Code Playgroud)

同时工作得很漂亮

function d(e::Int64)
    if e > 0
        println("Positive argument")
        function f()
            println("Return positive")
            return e
        end
    else
        println("Negative argument")
        function f()
            println("Return negative")
            return e
        end
    end
    return f
end
Run Code Online (Sandbox Code Playgroud)

在使用时有效,但做了非常直观的事情:

>>> g = d(2)
Positive argument
(::f) (generic function with 1 method)
>>> g()
Return negative
2
Run Code Online (Sandbox Code Playgroud)

或者:

>>> g = d(-2)
Negative argument
ERROR: UnderVarError: f not defined
Run Code Online (Sandbox Code Playgroud)

这可能比返回意想不到的东西更有用,但更令人困惑的是.

我希望 …

first-class-functions julia

3
推荐指数
1
解决办法
75
查看次数

朱莉娅:为什么共享内存多线程没有给我提速?

我想在Julia中使用共享内存多线程。正如Threads。@ threads宏所做的那样,我可以使用ccall(:jl_threading_run ...)来执行此操作。尽管我的代码现在可以并行运行,但我没有达到我期望的加速。

以下代码旨在作为我所采用的方法和所遇到的性能问题的一个最小示例:[编辑:稍后请参见更多最小示例]

nthreads = Threads.nthreads()
test_size = 1000000
println("STARTED with ", nthreads, " thread(s) and test size of ", test_size, ".")
# Something to be processed:
objects = rand(test_size)
# Somewhere for our results
results = zeros(nthreads)
counts = zeros(nthreads)
# A function to do some work.
function worker_fn()
    work_idx = 1
    my_result = results[Threads.threadid()]
    while work_idx > 0
        my_result += objects[work_idx]
        work_idx += nthreads
        if work_idx > test_size
            break
        end
        counts[Threads.threadid()] += 1
    end
end

# Call …
Run Code Online (Sandbox Code Playgroud)

parallel-processing julia

2
推荐指数
1
解决办法
465
查看次数