iterator - 是否有用于从 julia 中的类似生成器的函数创建快速迭代器的宏?

标签 iterator julia iterable

从 python3 到 Julia 的人希望能够写 快速迭代器作为具有生产/产量语法或类似功能的函数。

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 的 Tasks,至少据我所知。然而,它们似乎也比纯迭代器慢得多。例如,如果您可以使用像 imap 这样的简单迭代器来表达您的函数。 , chain等等(由 Iterators.jl 包提供)这似乎是非常可取的。

理论上是否可以在 julia 中构建一个宏,将生成器样式的函数转换为灵活的 快速迭代器?

额外问题:如果可能的话,是否有一个通用的宏来内联这样的迭代器?

最佳答案

这种形式的一些迭代器可以这样写:

myiterator(as) = (a1[1] + a2[2] + 1 for (a1, a2) in zip(as, as[2:end]))

此代码可以(可能)内联。

为了完全概括这一点,理论上可以编写一个宏,将其参数转换为连续传递样式 (CPS),从而可以暂停和重新启动执行,提供类似于迭代器的东西。分隔的延续特别适合于此( https://en.wikipedia.org/wiki/Delimited_continuation )。结果是一大堆匿名函数,这可能比任务切换更快,但不一定,因为在一天结束时,它需要堆分配类似数量的状态。

我碰巧在这里有一个这种转换的例子(虽然在 femtolisp 中,而不是 Julia):https://github.com/JeffBezanson/femtolisp/blob/master/examples/cps.lsp
这以 define-generator 结束做你描述的宏。但我不确定为 Julia 做这件事是否值得。

关于iterator - 是否有用于从 julia 中的类似生成器的函数创建快速迭代器的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43575697/

相关文章:

java - 如果使用 LinkedList add 方法修改底层列表,iterator.next 是否也会被修改?

python - 迭代 DataFrame,评估列值,并将值设置为第三列

java - 如何在一个 hashmap 上设置 2 个迭代器

julia - 将 Bool 矩阵写为 0,1 矩阵

arrays - 在 Julia 中初始化数组

performance - 优化不同大小的矩阵乘法

java - 自定义迭代器返回对象

python - 遍历 string->string dict 只给出每个的第一个字符

c++ - 在 C++ 中将惰性生成器实现为 forward_iterator

memory - 克隆迭代器会复制整个底层向量吗?