当前位置:   article > 正文

Python:List\Numpy\DataFrame大规模查找效率(同时查询多个元素的索引)_python在数组中同时寻找多个元素

python在数组中同时寻找多个元素
1. 问题描述

  有一个包含大约321w个元素的List型变量A,一个包含200个元素的List型变量B。现在需要找出B中各元素在A中对应的索引,若B中的某个元素没有出现在A中,则不返回。那么怎么才能高效地从A中查找到B中的元素呢?

2. 解决方案

  想要提高查找速度最简单的方法就是用“空间换时间”。即,修改A\B两个元素的数据类型,利用其他数据类型的优势来提高查找速率。

3. 具体方法

  关于下述代码,有以下几点需要事先说明:

  • 下述代码中A、B中的元素将采用随机算法直接生成数值型的元素,并不是原始问题中的字符串,但查找元素的代码是可以通用的。其中A中供有300w个元素,B中的元素共有300个。
  • 下述代码中分别对比了当A、B分别为List型、Numpy型、pandas中的DataFrame型类型时对应的查找时间复杂度。

具体代码如下:

import pandas as pd
import numpy as np
import random
import time

A=list(range(3000000)) #生成长度为300w的list型元素A
B=A[:300]
random.shuffle(A) #将A中的元素顺序打乱

#List型查找时间
t0=time.time()
idx_list=[A.index(item) for item in B if item in A]
t1=time.time()
print("List型查找时间:{:.3f}".format(t1-t0))

#Numpy型查找时间
np_A=np.array(A)
np_B=np.array(B)
t0=time.time()
idx_np=np.where(np_A==np_B[:,None])[-1]
t1=time.time()
print("Numpy型查找时间:{:.3f}".format(t1-t0))

#Pandas型查找时间
pd_A=pd.DataFrame(A)
t0=time.time()
idx_dt=pd_A[pd_A[0].isin(B)].index #但要注意使用该方法得到的索引顺序是从小到大的,其索引值的顺序与B中元素的顺序并不一致。如果让表达式中的.index去掉,就可以得到每个值及其索引值了。
t1=time.time()
print("DataFrame型查找时间:{:.3f}".format(t1-t0))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

其实验结果如下:从目前的结果来看,DataFrame的查询效率会更高。

List型查找时间:33.431
Numpy型查找时间:2.027
DataFrame型查找时间:0.058

总结:

  • 对于List型变量,使用in判断某个元素是否在某个List型变量A中时,会将A中的元素依次与目标元素比较,所以时间复杂度较高。
  • 当A依次为List型、Numpy型、DataFrame型时,耗时依次减少,这也是“空间换时间”带来的效率提升。(使用sys.getsizeof方法可以查看变量A\np_A\pd_A所占的内存空间,其所占内存空间是依次增大的)
  • 由于变量A太大,占用的空间太多,为了防止内存溢出,可以在完成索引查找之后向DataFrame型、Numpy型的变量删除,释放内存。
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号