ITADN
JuliaDynamics/ResumableFunctions.jl
JuliaDynamics/ResumableFunctions.jl · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

ResumableFunctions

文档 Documentation of latest stable version Documentation of dev version
持续集成 GitHub Workflow Status
代码覆盖率 Test coverage from codecov
使用 JET static analysis Aqua QA

status DOI

C# 提供了一种使用 yield return 语句创建迭代器的便捷方式。包 ResumableFunctions 通过引入 @resumable@yield 宏,为 Julia 语言 提供了相同的功能。这些宏可用于替代在 Julia v0.6 中已弃用的 Task 切换函数 produceconsumeChannels 是 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)

作者

贡献

  • 要讨论问题或功能请求,请提交一个 issue。对于 bug,请尽可能包含尽可能多的信息,包括操作系统、julia 版本以及 MacroTools 的版本。
  • 要做出贡献,请提交一个 pull request。贡献应包含针对任何新功能/bug 修复的测试。

发布说明

详细变更日志 已保留。

注意事项

  • try 块中,仅允许顶层 @yield 语句。
  • finally 块中,不允许使用 @yield 语句。
  • 匿名函数不能包含 @yield 语句。
  • @isdefined 不能用于可恢复函数中。
  • 还有更多限制。