JuliaDynamics/ResumableFunctions.jl · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈
ResumableFunctions
| 文档 |
|
| 持续集成 |
|
| 代码覆盖率 |
|
| 使用 |
|
C# 提供了一种使用 yield return 语句创建迭代器的便捷方式。包 ResumableFunctions 通过引入 @resumable 和 @yield 宏,为 Julia 语言 提供了相同的功能。这些宏可用于替代在 Julia v0.6 中已弃用的 Task 切换函数 produce 和 consume。Channels 是 julia v0.6+ 中任务间通信的首选方式,但其在迭代器应用中的性能较差。请参阅下方的基准测试部分。
安装
ResumableFunctions 是一个注册包,可通过运行以下命令进行安装:
using Pkg
Pkg.add("ResumableFunctions")
示例
using ResumableFunctions
@resumable function fibonacci(n::Int) :: Int
a = 0
b = 1
for i in 1:n
@yield a
a, b = b, a+b
end
end
for fib in fibonacci(10)
println(fib)
end
# Example which specifies the length
using ResumableFunctions
@resumable length=n^2 function fibonacci(n::Int) :: Int
a = 0
b = 1
for i in 1:n^2
@yield a
a, b = b, a+b
end
end
for fib in fibonacci(5)
println(fib)
end
基准测试
以下代码块是在配备如下处理器的 Macbook Pro 上运行 julia --project=. benchmark/benchmarks.jl 的结果:Intel Core i9 2.4 GHz 8-Core。使用的 Julia 版本为 1.5.3。
使用 Int 值的斐波那契数列:
Direct:
27.184 ns (0 allocations: 0 bytes)
ResumableFunctions:
27.503 ns (0 allocations: 0 bytes)
Channels csize=0:
2.438 ms (101 allocations: 3.08 KiB)
Channels csize=1:
2.546 ms (23 allocations: 1.88 KiB)
Channels csize=20:
138.681 μs (26 allocations: 2.36 KiB)
Channels csize=100:
35.071 μs (28 allocations: 3.95 KiB)
Task scheduling
17.726 μs (86 allocations: 3.31 KiB)
Closure:
1.948 μs (82 allocations: 1.28 KiB)
Closure optimised:
25.910 ns (0 allocations: 0 bytes)
Closure statemachine:
28.048 ns (0 allocations: 0 bytes)
Iteration protocol:
41.143 ns (0 allocations: 0 bytes)
包含 BigInt 个值的斐波那契数列:
Direct:
5.747 μs (188 allocations: 4.39 KiB)
ResumableFunctions:
5.984 μs (191 allocations: 4.50 KiB)
Channels csize=0:
2.508 ms (306 allocations: 7.75 KiB)
Channels csize=1:
2.629 ms (306 allocations: 7.77 KiB)
Channels csize=20:
150.274 μs (309 allocations: 8.25 KiB)
Channels csize=100:
44.592 μs (311 allocations: 9.84 KiB)
Task scheduling
24.802 μs (198 allocations: 6.61 KiB)
Closure:
7.064 μs (192 allocations: 4.47 KiB)
Closure optimised:
5.809 μs (190 allocations: 4.44 KiB)
Closure statemachine:
5.826 μs (190 allocations: 4.44 KiB)
Iteration protocol:
5.822 μs (190 allocations: 4.44 KiB)
作者
- Ben Lauwens, Royal Military Academy, Brussels, Belgium.
- JuliaDynamics and QuantumSavory volunteers.
贡献
- 要讨论问题或功能请求,请提交一个 issue。对于 bug,请尽可能包含尽可能多的信息,包括操作系统、julia 版本以及 MacroTools 的版本。
- 要做出贡献,请提交一个 pull request。贡献应包含针对任何新功能/bug 修复的测试。
发布说明
详细变更日志 已保留。
注意事项
- 在
try块中,仅允许顶层@yield语句。 - 在
finally块中,不允许使用@yield语句。 - 匿名函数不能包含
@yield语句。 @isdefined不能用于可恢复函数中。- 还有更多限制。