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

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))

其实验结果如下:从目前的结果来看,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型的变量删除,释放内存。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值