You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

支持高效动态更新的空间数据结构:Python近邻搜索库需求

推荐支持动态更新的近邻搜索Python库

以下是几款满足你需求的工具,涵盖精确/近似近邻搜索、动态更新能力,部分支持GPU加速:

1. FAISS

  • 核心特性:Facebook开源,支持精确与近似近邻搜索,原生支持动态添加向量(部分索引类型如IndexIVFFlat、IndexHNSWFlat还支持删除操作),GPU加速适配完善,大规模数据集下性能突出。
  • 简单使用示例:
    import faiss
    import numpy as np
    
    # 初始化支持动态更新的IVF索引(L2距离)
    dim = 128
    cluster_num = 100
    index = faiss.IndexIVFFlat(faiss.IndexFlatL2(dim), dim, cluster_num)
    
    # 训练索引(IVF类型必须步骤)
    train_data = np.random.random((1000, dim)).astype('float32')
    index.train(train_data)
    
    # 批量添加初始向量
    index.add(train_data)
    
    # 动态添加新向量
    new_data = np.random.random((100, dim)).astype('float32')
    index.add(new_data)
    
    # 执行近邻搜索
    query = np.random.random((1, dim)).astype('float32')
    distances, indices = index.search(query, k=5)
    
  • 注意:基础扁平索引(如IndexFlatL2)不支持动态更新,需选择IVF、HNSW等支持动态操作的索引类型。

2. hnswlib

  • 核心特性:基于HNSW算法,支持精确/近似搜索,高效动态增删向量,性能接近FAISS,官方提供GPU扩展版本(需单独安装),内存占用优化较好。
  • 简单使用示例:
    import hnswlib
    import numpy as np
    
    dim = 128
    init_max_elements = 1100  # 预分配足够空间
    
    # 初始化L2距离的索引
    index = hnswlib.Index(space='l2', dim=dim)
    index.init_index(max_elements=init_max_elements, ef_construction=200, M=16)
    
    # 添加初始数据
    init_data = np.random.randn(1000, dim).astype(np.float32)
    index.add_items(init_data, np.arange(1000))
    
    # 动态添加新数据
    new_data = np.random.randn(100, dim).astype(np.float32)
    index.add_items(new_data, np.arange(1000, 1100))
    
    # 搜索近邻
    query = np.random.randn(1, dim).astype(np.float32)
    indices, distances = index.knn_query(query, k=5)
    
  • 注意:若预分配空间不足,可调用resize_index扩展容量。

3. Annoy

  • 核心特性:Spotify开源,专注近似近邻搜索,支持动态添加向量,内存占用低,使用门槛低,无官方GPU支持但CPU性能足够应对中小规模场景。
  • 简单使用示例:
    from annoy import AnnoyIndex
    import random
    
    dim = 40
    # 初始化角距离度量的索引
    index = AnnoyIndex(dim, 'angular')
    
    # 添加初始向量
    for i in range(1000):
        vec = [random.gauss(0, 1) for _ in range(dim)]
        index.add_item(i, vec)
    
    # 构建索引(树数量越多精度越高)
    index.build(10)
    
    # 动态添加新向量后需重新构建
    index.add_item(1000, [random.gauss(0,1) for _ in range(dim)])
    index.unbuild()
    index.build(10)
    
    # 搜索近邻
    nearest_indices = index.get_nns_by_item(0, 5)
    

4. PyNNDescent

  • 核心特性:基于近似近邻下降算法,支持动态更新,无需预训练,适合中小规模数据集,纯CPU实现但速度可观,集成简单。
  • 简单使用示例:
    from pynndescent import NNDescent
    import numpy as np
    
    init_data = np.random.randn(1000, 50)
    # 初始化欧氏距离的索引
    index = NNDescent(init_data, metric='euclidean')
    
    # 动态添加新数据
    new_data = np.random.randn(100, 50)
    index.prepare()
    index.add_items(new_data)
    
    # 搜索近邻
    neighbors = index.query(new_data[0:1], k=5)
    

内容的提问来源于stack exchange,提问作者Igor Rivin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:02:35