我正在使用 bisect 模块来搜索 sha256 哈希并将其插入到列表中。
我有大约 8,000,000 个要搜索和添加的项目,它们存储在 sqlite 数据库中,我想将它们读入列表中,以便更快地搜索它们。
我遇到的问题是使用 bisect 将项目插入列表以找到正确的插入点非常慢。完成所有 8,000,000 个项目大约需要 700 秒。
在 sqlite 数据库中按升序创建索引只需要大约 90 秒,然后将这些按顺序插入到列表中大约需要 60 秒。
问题是当我这样做时,对某些项目的平分搜索失败,但如果我按顺序搜索项目以查找哈希,它实际上就在那里。
所以看起来数据库提供的顺序与使用 bisect 获取索引位置时提供的顺序不太一样。
任何想法为什么会这样?在依赖 bisect 之前能够对列表进行预排序会非常有用。
更新....根据评论,我应该解释一下我有一个行为类似于列表的自定义类,它将散列打包在一个字节数组中以节省内存。这是我的课
class Hashlist():
def __init__(self, hashLen):
self.__hashLen = hashLen
self.__hashlist = bytearray()
self.__num_items = 0
def __getitem__(self, index):
if index >= len(self) or index < 0:
print index
raise IndexError("hash index out of range")
return
return str(self.__hashlist[index*self.__hashLen:(index+1)*self.__hashLen])
def __setitem__(self, index, data):
if index > len(self) or index < 0:
raise IndexError("hash index out of range")
return
if index == len(self):
self.__hashlist.extend(data)
else:
self.__hashlist[index*self.__hashLen:(index+1)*self.__hashLen] = data
def insert(self, index, data):
oldlen = len(self.__hashlist)/self.__hashLen
if index > oldlen or index < 0:
raise IndexError("trying to insert past next element")
return
if index == oldlen:
self.__hashlist.extend(data)
else:
# move the data
if self.__hashLen == 1:
self.__hashlist.append(chr(0))
orig_data = str(self.__hashlist[(index):(len(self.__hashlist)-1)])
self.__hashlist[(index + 1)*self.__hashLen:(len(self.__hashlist))*self.__hashLen] = orig_data
#replace existing data
self.__hashlist[index*self.__hashLen:(index+1)*self.__hashLen] = data
else:
orig_data = str(self.__hashlist[(index*self.__hashLen):(len(self.__hashlist) -1)*self.__hashLen])
self.__hashlist[(index + 1)*self.__hashLen:(len(self.__hashlist))*self.__hashLen] = orig_data
#replace existing data
self.__hashlist[index*self.__hashLen:(index+1)*self.__hashLen] = data
谢谢
院长