欢迎!请参见关于页面获取有关如何工作的更多信息。
目前,Cycle, Range和Repeat没有实现索引化,这意味着"nth"的平均时间是O( n )。
建议的更改是实现这些类别的索引化,使得"nth"成为O( 1 )操作。
评论者:alexmiller
这是一个对过去这些函数所做的工作的能力和承诺的扩展。我们已经为它们承诺了比我们真正想要的更多,所以我弄不清我们是否还想添加更多承诺。无论如何,我们不会在1.7中这么做。
顺便说一下,您正在修补的这个Range当前并没有用于任何地方 - 当前的实现在core.clj中使用了一个分块seq定义。CLJ-1515(可能)会用一个全新的实现替换Range类。无论如何,修补范围内的这个补丁可能直到CLJ-1515解决之前都没有什么用。
评论者:mikera
关于1.7,我明白了。尽管我个人认为这个功能足够小,足以塞进去。您的选择。
然而,我仍然认为这种方法是有用的:nth是一个非常常见的操作,我在CLJ-1515中还没有注意到您对其进行基准测试。不论使用什么新的Range实现,都会有索引化的好处。
目前,这些函数没有一个承诺返回索引化结果。如果我们添加这个特性,并且人们开始依赖它,我们就不能以移除它的方式改变实现。所以我不确定这是否是一个我们想做出的承诺。
我并不是提议我们承诺返回一个索引化的值,只是说这样的类应该将接口实现细节作为一个实现细节(在合理的地方)。
这样做使得在像RT.nth这样的函数中采取快速路径,因此对于最常见的索引查找情况,我们得到O(1)而不是O(n)。
坦白说,我假设这是“索引化”接口的主要目的,即允许具体的集合类型以高效的实现方式参与Clojure的索引访问函数。
评论者:gshayban
人们通常会依赖于实现细节,不管是否有承诺。如果Clojure添加索引并移除它,人们的代码可能会出问题或者变慢。
实现行为(无论是显式还是隐式的)必然被视为未来的约束(锁链),因此我们需要谨慎对待。