欢迎!请参阅 关于 页面以了解更多有关如何使用本站的信息。
目前,Cycle、Range 和 Repeat 没有实现 Indexated,这意味着 "nth" 的平均复杂度为 O( n )。
建议的更改是实现这些类的 Indexated,使 "nth" 成为 O( 1 ) 操作。
评论由:alexmiller 提供
这是对这些功能的性能的扩展,我们已经为它们做出了一个以上的承诺,所以我不确定我们是否希望再添加更多的承诺。无论如何,我们不会在 1.7 中这么做。
顺便说一句,你正在修补的 Range 目前没有被用于任何事情 - 现行的实现在 core.clj 中使用了分块 seq 定义。CLJ-1515 将(可能)用全新的实现替换 Range 类。无论如何,在此修补 Range 的作用可能不大,直到 CLJ-1515 被解决。
评论由:mikera 提供
关于 1.7,我明白了。尽管我个人认为这很小,你可以把它塞进去。这是你的决定。
然而,我认为这种做法仍然很有用:nth 是一个非常常见的操作,我在 CLJ-1515 中也没有看到你对其进行的基准测试。无论使用何种新的 Range 实现,都将受益于索引化。
目前没有任何这些函数承诺返回索引化的结果。如果我们添加这个功能并且人们开始依赖它,我们就无法以移除它的方式进行实现上的变化。因此,我不确定这是不是一个我们想要做的承诺。
我并不是提议我们承诺返回一个索引化的返回值,而是说这样的类应该将接口实现作为实现细节(在合理的情况下)。
这使得函数如 RT.nth 中的快速路径被采取,因此对于最常见的索引查找情况,我们得到 O(1) 而不是 O(n)。
坦白说,我假设这是“Indexed”接口的主要目的,即允许具体的集合类型以有效的实现参与到 Clojure 的索引访问函数中。
评论者:gshayban
人们经常依赖于实现细节,无论是有无承诺。如果 clojure 添加了 Indexed 然后删除它,人们的代码可能会崩溃或变慢。
实现行为(无论是明确的还是隐含的)必然被视为未来约束(镣铐),因此需要仔细考虑。