【发布时间】:2017-09-20 09:41:03
【问题描述】:
从 python3 到 Julia,希望能够将 fast 迭代器编写为具有生产/产量语法或类似内容的函数。
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
myiterator 在理想情况下应该创建一个开销尽可能低的快速迭代器。当然,这只是一个具体的例子。理想情况下,我希望拥有适用于所有或几乎所有生成器功能的东西。
目前推荐的将生成器函数转换为迭代器的方法是通过 Julia 的任务,至少据我所知。然而,它们似乎也比纯迭代器慢得多。例如,如果您可以使用 imap、chain 等简单的迭代器(由 Iterators.jl 包提供)来表达您的函数,这似乎是非常可取的。
理论上是否有可能在 julia 中构建一个将生成器风格的函数转换为灵活的 fast 迭代器的宏?
Extra-Point-Question:如果可能的话,是否有一个内联此类迭代器的通用宏?
【问题讨论】:
-
Channels,在 0.6 中替换Tasks,应该比Tasks 快得多。 -
我还没有听说过它们,并且我阅读了很多关于 julia 的文档。谢谢指点!
-
Channels 不会取代 Tasks --- 它们是 Tasks 可以用来交流的一种机制。