在zodb.btrees之上的一个高效的低级搜索执行引擎。

dm.incrementalsearch的Python项目详细描述


dm.incrementalsearch
==dm.incrementalsearch``是一个高效的低级搜索执行引擎。
第一次击中,然后是第二次击中,
然后是第三次击中,等等。因此,可以非常快地确定前几次击中。但是,即使需要确定所有的命中率,子查询的增量执行也会导致某些查询类型(特别是那些由特定的"和"查询支配的查询类型)的多个顺序的加速。但通常可以用增量过滤来代替它们。使用此技术,子查询将从
原始搜索中删除,修改后的搜索将执行,结果将由删除的子查询过滤。`` incremental search``支持增量过滤
,因此可以再次获得多个加速顺序,否则很难处理查询类型。

此列表的元素是"isearch"的命中率。
"isearch"的"keytype"确定列表元素的类型。当前支持的是``object``(可比较的python对象)、
``int``(python 32位整数)和``long``(python 64位整数)。

看一些例子。

也就是说,我们对这些btree交叉点中包含的元素感兴趣。

>;>;来自dm.incrementalsearch import ibtree,iand\u int,unspecified,\
…最后,我们通过应用"ibtree"操作符(增量btree)将btree转换成可增量搜索的对象。然后
我们用"iand_int"组合它们,并指示通过调用"complete"将不再添加
。这会导致几个优化
发生。

>;>;isearch=iand廑int(*map(ibtree,seq廑btrees))
>;>;isearch.complete()

方法"advancefrom"和"advanceto"在搜索中向前移动。要确定第一次命中,我们可以使用:

>;>cl=isearch.advancefrom(未指定,未指定)
>;>gt;如果cl!=在结尾:
…第一次点击=iSearch.value

>下一次点击由

>;>cl=iSearch.advancefrom(iSearch.value,未指定)
>;>if cl决定!=在结尾:
…下一个"hit=isearch.value

=在结尾:
…hit_above_1000=iSearch.value


我们还可以指出,我们只对低于
一些较高值的hits感兴趣。


>;>cl=iSearch.advancefrom(2000,10000)
>;如果cl==inList_成功:
…hit_above_2000_below_10000=isearch.value


我们可以使用"as set"方法获得所有hit
作为(btree)集。``资产``只应在新鲜的,即(目前)未升级的iSearch上调用(如果需要,我们可以稍后删除此限制)。


>;>;iSearch=iand廑int(*map(iStree,seq廑btrees))
>;>;iSearch.complete()
>;>bset=isearch.asset()

isearch也支持迭代。

>;




``isearch``构造器
``ior`
通过一个或一个`
``inot`
将``isearch``组合起来,否定一个``isearch``
``ifilter`
一个过滤``isearch``
``iempty``
空的``isearch`
``isearch`
一个基类来定义自己的``isearch``es

任何``isearch``都需要知道它的键类型。只有相同keytype的"isearch"es
才能组合起来。

``ibtree``和
``inot``可以确定keytype本身。
对于其他构造函数,keytype是第一个参数。
为了方便起见,``iand``,``ior``和``ifilter``具有固定keytype的
专门化,例如``iand`int`,
``iand`obj`和``iand`long`。

``inot`和``ifilter``在它们的``advancefr`需要枚举器时调用om`
。枚举器枚举搜索
域中的元素(可能的命中)。它有方法"check(elem)",该方法
检查*elem*是否在域中,"`next(elem)"`
返回域中*elem*后面的元素或
"unspecified"。``dm.incrementalsearch``
中的``enumerator``类将``btree``转换为枚举器。


有关详细信息,请参阅docstrings。

安装
----


有报告称,``dm.incrementalsearch``
的c部分不在windows下编译。显然,使用了gnu c预处理器的一些扩展
,这在microsoftc编译器中是不可用的。因此,当您想在windows下使用"dm.incrementalsearch"时,可能需要cygwin
(或者至少需要gnu c预处理器并说服microsoft
编译器将其用作预处理器)。

E ZODB)。如果``btrees`
的数据结构发生剧烈变化,则这些部分可能会中断(尽管危险很小)。
在这种情况下,需要对``btrees`u structs.h``的内容进行调整。请参阅此文件开头的注释。



advance requirement
----


我们不能使用"advance"函数向后移动,在
中,精确意义如下:


1。当*key*作为第一个参数传递给``advance to``时,
则以后调用此isearch的``advance``函数的任何第一个参数都不能小于*key*

2。当*fromkey*作为第一个参数传递给``advancefrom``时,
则以后调用此ISearch的``advance``函数的任何第一个参数必须(严格地)大于*fromkey*


违反条件时,行为是未定义的。



advance funct离子返回值可能不完全服从,因为它们可以比你告诉它们的更进一步。但是,它们不会在任何命中部位移动。从概念上讲,"isearch"是一个经过排序的点击列表,它是惰性计算的。"`advance`` functions"
返回值告诉调用方调用的服从程度:

``in list`u success`
调用正是按照调用方的指示执行的,
当前值在列表中(即命中)

``inlist`u success``是整数``0`.
`inlist`
呼叫无法执行呼叫方告诉它的操作(没有命中)并进一步移动到下一个命中
``candidate`
呼叫无法执行呼叫方告诉它的操作(没有命中)并进一步移动。当前值可能
,也可能不是HIT。
``不包括ist`
调用前进到非命中状态。`` advancefrom``(与``advanceto```不同)必须
不返回此值。
``在``开始`
列表上的迭代尚未开始;当前值为
未定义
``在``结束`
列表已用尽,没有更多的点击;当前值为
未定义,并且进一步``不再允许advance``调用。


最后一次"advance`"调用的结果存储为属性
``分类``。




r``)

还定义了``union``和``difference``(在``intersection```旁边)。
(不同于``intersection```),它们的效率可能比相应的``btrees`
操作低,但可以处理不均匀的结构,前提是它们具有相同的密钥类型。例如,可以计算"iiset"与"iobtree"的并集。


``estimatedsize``现在可以在外部为"ibtree"对象设置
(以支持缓存)。


3.0


对于python 2.7/3.4+,btrees 4+
仅在*nix下测试

2.0


python 2.4.5+,zodb 3.8+(zope 2.11+)
仅在*nix下测试;现在也在64位体系结构上运行

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将字符串转换为自定义对象   java如何从socket方法获取数据?   Java中的soap读取回车和新行   java在单击时替换图像   java推荐的使用RXJava执行异步任务的方法   java MySql连接器JDBC驱动程序不支持连接池吗?   java将活动堆栈清理到顶部   java计数用户输入的数量   java从webservice下载大文件导致应用程序性能问题   JavaLocalDate。EPOCH不可用   java如何在使用Selenium等待一定时间后,在页面无法加载(get(url))时自动刷新页面   java Calendar setLenient方法不允许检查年份字段的健全性   java Eclipse和intelliJ 安卓 SDK问题   java为什么我可以在没有super关键字的情况下调用父方法?   java iText的PDF格式不好