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

PyTorch向量交集快速检测方法探究

快速判断两个PyTorch向量是否存在共同元素的最优方案

问题

给定两个PyTorch向量v1、v2,如何以最快速度判断二者是否存在共同元素?

环境设置

  • 数据类型:torch.int64
  • v1:长度106-108,预计算的唯一有序元素向量
  • v2:长度105-107,每次都会变化
  • 典型场景:二者无共同元素
  • 优先支持CPU和GPU双平台

已验证的方案

  1. torch.isin(v1, v2, assume_unique=True):设置assume_unique=True可使速度提升高达10倍,必须利用这个参数优化
  2. torch.searchsorted 匹配验证:先通过searchsorted在有序v1中定位v2元素的位置,再验证位置对应元素是否与v2相等,多数场景下速度最快;但后续的求和/存在性判断步骤耗时占比高,仍有优化空间
  3. 其他方案:性能更差,不推荐

CPU性能测试结果

方法耗时设备L1长度L2长度交集大小L1唯一元素数L2唯一元素数
isin direct1.365cpu1,000,0001,000,00001,000,0001,000,000
isin assume_unique0.778cpu1,000,0001,000,00001,000,0001,000,000
search sorted0.136cpu1,000,0001,000,00001,000,0001,000,000
isin direct13.286cpu10,000,0001,000,000010,000,0001,000,000
isin assume_unique1.823cpu10,000,0001,000,000010,000,0001,000,000
search sorted0.321cpu10,000,0001,000,000010,000,0001,000,000

GPU性能测试结果

注:测试中torch.randint存在bug导致交集大小数据不准确,但耗时数据有效;该bug已在后续版本修复。

方法耗时设备L1长度L2长度交集大小L1唯一元素数L2唯一元素数
isin direct0.005cuda1,000,0001,000,000311,8721,000,0001,000,000
isin assume_unique0.003cuda1,000,0001,000,000311,8721,000,0001,000,000
search sorted0.001cuda1,000,0001,000,000311,8721,000,0001,000,000
isin direct0.034cuda10,000,0001,000,0001,000,00010,000,0001,000,000
isin assume_unique0.011cuda10,000,0001,000,0001,000,00010,000,0001,000,000
search sorted0.003cuda10,000,0001,000,00099,48010,000,0001,000,000
isin direct0.296cuda10000000010000001023183.098845253.0999877.0
isin assume_unique0.081cuda1000000001000000999877.098845253.0999877.0
search sorted0.003cuda100000000100000010019.098845253.0999877.0

特殊场景测试(向量规模相近)

当两个向量规模相近(如均为10^7)时,各方法性能差异极小:

场景1:双10^7规模向量

方法耗时设备L1长度L2长度交集大小L1唯一元素数L2唯一元素数
isin direct0.041cuda1000000010000000496533599883539988316
isin direct v2→v10.034cuda1000000010000000496526699883539988316
isin assume_unique0.020cuda1000000010000000495663299883539988316
isin assume_unique v2→v10.020cuda1000000010000000495663299883539988316
search sorted0.026cuda1000000010000000496526699883539988316

场景2:10^8 vs 5×10^7规模向量

方法耗时设备L1长度L2长度交集大小L1唯一元素数L2唯一元素数
isin direct0.354cuda10000000050000000505749739884571149711185
isin direct v2→v10.229cuda10000000050000000499961269884571149711185
isin assume_unique0.138cuda10000000050000000497073119884571149711185
isin assume_unique v2→v10.137cuda10000000050000000497073119884571149711185
search sorted0.184cuda10000000050000000499961269884571149711185

实验代码示例

方案1(基础isin)

m = torch.isin(v1, v2)
has_common = m.sum().item() > 0

方案2(带unique优化的isin)

v2unique = torch.unique(v2)
m = torch.isin(v1, v2unique, assume_unique=True)
has_common = m.sum().item() > 0

方案3(searchsorted验证)

ts = torch.searchsorted(v1, v2)
# 处理超出v1范围的索引
ts[ts >= len(v1)] = len(v1) - 1
# 直接判断是否存在匹配,无需求和
has_common = (v1[ts] == v2).any().item()

内容的提问来源于stack exchange,提问作者Alexander Chervov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:51:01