gpt4 book ai didi

python - 当结果很大时,在 pytable 中使用索引搜索比不使用索引要慢

转载 作者:行者123 更新时间:2023-11-28 17:43:56 25 4
gpt4 key购买 nike

以下代码创建一个测试 hdf5 文件:

from tables import *

class KeyValue(IsDescription):
key = StringCol(itemsize=30, dflt=" ", pos=0) # character String
value = Int64Col(dflt=0, pos=1)

f = open_file("keyvalue.h5", "w")
kv = f.create_table("/", "keyvalues", KeyValue)

import string
import random

for j in range(20):
values = []
for i in xrange(100000):
key = "".join(random.sample(string.uppercase, 5))
value = random.randint(0, 1000000)
values.append((key, value))
kv.append(values)

f.close()

这是速度测试代码:

f = open_file("keyvalue.h5", "a")
kv = f.root.keyvalues

kv.cols.value.remove_index()

print "without index"
%timeit a = kv.read_where('value < 10')
%timeit a = kv.read_where('value < 1000')

kv.cols.value.create_csindex()

print "with index"
%timeit a = kv.read_where('value < 10')
%timeit a = kv.read_where('value < 1000')

f.close()

输出是:

without index
10 loops, best of 3: 66.1 ms per loop
10 loops, best of 3: 109 ms per loop
with index
10000 loops, best of 3: 164 µs per loop
10 loops, best of 3: 121 ms per loop

当查询 'value < 10' 时,使用索引搜索比不使用索引要快得多,但是当查询 'value < 1000' 时,它比没有索引慢。

我想知道这是怎么发生的,你能把 timeit 结果贴到你的机器?

最佳答案

所以这很可能发生,因为当您查询的总数据集只有一小部分时,索引效果最好。在您给出第一个查询的示例中,value < 10 , 满足这个约束并且查询速度快得多。第二个查询,value < 1000 , 刚好超过这个约束的尖端,因此速度较慢。 “小”的含义可能取决于您的数据集。因此,值得获得一些时间信息来帮助您做出决定。

正如您在 this notebook that I made 中看到的那样,随着您增加值范围的子集,查询变得越来越慢。对于您的特定操作(小于一个数字),当然可以对索引进行优化,但不适用于其他类型的索引。现在存在的索引可以处理更广泛的用例和查询。在 pytables-dev 邮件列表中提出这个问题可能是值得的。

更新:

时序图: enter image description here

关于python - 当结果很大时,在 pytable 中使用索引搜索比不使用索引要慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20769818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com