sch*_*ers 10 iterator iterable julia
从python3到Julia,人们希望能够将快速迭代器编写为具有yield/yield语法的函数或类似的东西.
Julia的宏似乎暗示可以构建一个宏,将这种"生成器"函数转换为julia迭代器.[它甚至看起来你可以很容易地内联函数风格的迭代器,这是Iterators.jl包也尝试为其特定的迭代器提供的功能https://github.com/JuliaCollections/Iterators.jl#the-itr- macro-for-automatic-inlining-in-for-loops ]
只是举个例子来说明我的想法:
@asiterator function myiterator(as::Array)
b = 1
for (a1, a2) in zip(as, as[2:end])
try
@produce a1[1] + a2[2] + b
catch exc
end
end
end
for i in myiterator([(1,2), (3,1), 3, 4, (1,1)])
@show i
end
Run Code Online (Sandbox Code Playgroud)
myiterator理想情况下应该在哪里创建一个尽可能低开销的快速迭代器.当然,这只是一个具体的例子.理想情况下,我想拥有适用于所有或几乎所有发电机功能的东西.
目前推荐的将生成器函数转换为迭代器的方法是通过Julia的任务,至少据我所知.然而,它们似乎也比纯粹的迭代器慢.例如,如果你可以用简单的迭代器表示你的函数imap,chain等等(由Iterators.jl包提供),这似乎是非常可取的.
在julia理论上是否有可能将生成器类型的宏转换为灵活的快速迭代器?
额外问题:如果可能的话,是否有一个通用宏可以内联这样的迭代器?
Python 风格的生成器 \xe2\x80\x93\xc2\xa0 在 Julia 中最接近于从任务 \xe2\x80\x93\xc2\xa0 中产生,涉及相当多的固有开销。您必须切换任务,这并不简单,并且编译器无法直接消除。这就是为什么 Julia 的迭代器基于转换一个通常不可变的简单状态值和另一个的函数。长话短说:不,我不相信这种转变可以自动完成。
\n