Skip to main content
 首页 » 编程设计

python之集合元素的成对比较

2024年11月24日35thcjp

我有一个图像数据集,这些图像根据它们的趣味性进行排序。我想通过计算候选元素与该子集的所有当前成员之间的成对相似性来创建一个多样化的子集。

我的代码如下。看起来工作正常;但是,您可以猜到它非常慢(需要 6-7 小时)。

我想知道是否有另一种方法可以比此实现更快地创建此子集。

dataset = [a,b,c,d,e,f,g,...] #an example sorted dataset. real size is 20K 
subset = [] #my diverse set. Desired size is 200 
 
for ind, element in enumerate(dataset): 
  if ind == 0: 
    subset.append(element[ind]) #since the dataset is sorted I can directly add the first element 
  else: 
    similarities = [] 
    for member in subset: 
      similarities.append(compute_similarity(element[ind], member)) 
 
    if not any(similarities): #if the candidate is not similar to any of the existing members 
      subset.append(element[ind]) 
 
  if len(subset) >= 200: 
    break 

请您参考如下方法:

我看到的主要改进是,一旦您发现当前元素与您集合中已有的某个元素相似,就会立即中断。这可以简化您的代码,甚至可以消除对第一个元素进行额外检查的需要。

dataset = [a,b,c,d,e,f,g,...] #an example sorted dataset. real size is 20K 
subset = [] #my diverse set. Desired size is 200 
 
for candidate in dataset: 
  for member in subset: 
    if compute_similarity(candidate, member): 
      break 
  else: 
    subset.append(candidate) 
    if len(subset) >= 200: 
      break 

请注意 for-else 结构,如果 for 循环没有中断,它只会执行“else”分支。

任何其他优化将取决于您的实际相似性指标。也许您可以以某种方式对数据进行排序,从而减少需要进行的比较。