python搜索效率研究

天地不仁,以万物为刍狗 –老子

本文来研究在python中查找元素的效率问题,实验方法如下:

  1. 初始化一个大列表和字典,其中分别存放了10000000个元素。
  2. 查找的元素以1000000的间隔递增,检测程序执行速度。
  3. 自己实现顺序比较查找,用同样的方法进行测试,并和其他方法进行对比。

一、程序实现

程序实现包含上述三个查找算法,均很简单。

1.1 通过item in list实现查找

def find_item_in_list(item, mylist):
    if item in mylist:
        return True
    else:
        return False

1.2 通过dict.has_key实现查找

def find_item_in_dict(item, mydict):
    return mydict.has_key(item)

1.3 自定义顺序遍历查找

def my_find_in_list(item, mylist):
    for each in mylist:
        if item == each:
            return True
    return False

1.4 测试接口及shell脚本

driver如下

if __name__ == "__main__":
    # construct list and dict
    len = 10000000
    mylist = []
    mydict = {}
    for i in range(len):
        mylist.append(i)
        mydict[i] = True

    start = time.clock()
    num = int(sys.argv[1])
    #find_item_in_dict(num, mydict)
    #find_item_in_list(num, mylist)
    my_find_in_list(num, mylist)

    print time.clock() - start

shell实现如下

for i in $(seq 0 1000000 10000000)
do
    echo -n -e "Num = $i    "
    #echo `/usr/bin/time -f "%U" python has_num.py $i`
    python has_num.py $i
done

二、测试过程

在终端下执行

./test.sh

三、结果及分析

3.1 通过item in list实现的查找

查找元素时间/s
Num = 01.80000000003e-05
Num = 10000000.016998
Num = 20000000.036007
Num = 30000000.048604
Num = 40000000.073256
Num = 50000000.092047
Num = 60000000.108037
Num = 70000000.125925
Num = 80000000.145165
Num = 90000000.167104
Num = 100000000.180939

3.2 通过dict.has_key()查找

查找元素时间/s
Num = 03.10000000003e-05
Num = 10000003.00000000002e-05
Num = 20000003.00000000002e-05
Num = 30000002.90000000001e-05
Num = 40000003.2e-05
Num = 50000003.09999999999e-05
Num = 60000002.79999999999e-05
Num = 70000003.00000000002e-05
Num = 80000003.10000000003e-05
Num = 90000002.99999999998e-05
Num = 100000002.90000000001e-05

3.3 顺序查找

查找元素时间/s
Num = 02.09999999998e-05
Num = 10000000.039827
Num = 20000000.085993
Num = 30000000.135519
Num = 40000000.174482
Num = 50000000.21543
Num = 60000000.260043
Num = 70000000.271837
Num = 80000000.342575
Num = 90000000.389764
Num = 100000000.429033

通过gnuplot生成对比图如下

search.png

3.4 结果分析

在上图中,data1、data2和data3分别和上面的程序顺序对应,可以看到data1和data3都呈现顺序增长,而data2和其余两者相比,时间小到可以忽略不计。data3相比于data1消耗更多时间,而且data3接近一次关系,这和理论分析结果是一样的,因为list中的数据是从小到大依次排列的,随着查找元素的递增,需要增加匹配同样多次数才能匹配到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶玄青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值