• 深夜Python


    深夜Python - 第2夜 - 爬行

      我曾经幻想自己是一只蜗牛,有自己的一只小壳,不怕风,不怕雨,浪荡江湖,游历四方……夜猫兄一如既往地打断了我不切实际的幻想:“浪荡?游历?等你退休了都爬不出家门口!”我知道夜猫兄要说什么,所以趁机话题一转:“Python不也是爬行动物么?”(注:Python=巨蟒)

      “呵,英语不错啊。”

      “你这是夸我么?”哇,得到夜猫兄的表扬,我开心到感觉头发多了3成。

      夜猫兄正好闲着,给我来了段set、tuple、list运行速度对比的程序:

     1 # !/usr/bin/env python3
     2 # -*- coding=utf-8 -*-
     3 import timeit
     4 
     5 def func_use_set():
     6     N = 1000
     7     numbers = set(range(N))
     8     for number1 in numbers:
     9         for number2 in numbers:
    10             pass
    11 
    12 def func_use_tuple():
    13     N = 1000
    14     numbers = tuple(range(N))
    15     for number1 in numbers:
    16         for number2 in numbers:
    17             pass
    18 
    19 def func_use_list():
    20     N = 1000
    21     numbers = list(range(N))
    22     for number1 in numbers:
    23         for number2 in numbers:
    24             pass
    25 
    26 
    27 if __name__ == '__main__':
    28     print('set:', timeit.timeit(stmt=func_use_set, number=10), 's')
    29     print('tuple:', timeit.timeit(stmt=func_use_tuple, number=10), 's')
    30     print('list:', timeit.timeit(stmt=func_use_list, number=10), 's')

      在给出这段代码的时候,夜猫兄问我,你猜速度排名如何?

      “当然是set最快了,遍历时间的话,set < tuple < list。”我脱口而出,或许有着天生的迷之自信吧。

      “确定吗?嗯……”夜猫兄捻捻胡须,若有所思,“你试过?”

      “没啊,网友说的。”

      “靠!没试过你就信了??”夜猫兄猛地按下键盘上的Enter,简直要把键盘戳穿了。

      几秒过后,控制台输出了下面的数据。

    1 set: 0.5598647409997284 s
    2 tuple: 0.5289756949996445 s
    3 list: 0.4945050540000011 s

      “啊?这都是啥?”我的世界观已经崩塌……

      我尝试着加大规模,把N改成10000,还把三者执行的顺序调换了一下,夜猫兄的硬盘发出了吱吱呀呀的惨叫……很久没有出结果,我又把number改成5,就有了下面的数据。

    1 list: 24.5941286340003 s
    2 tuple: 24.454961858999923 s
    3 set: 26.473167070000272 s

      又试了很多次,结果都是set > tuple ≈ list。这下我傻眼了:“夜猫兄,你是不是偷偷把Python源码改了?”

      “你丫想啥呢,回去拿你自己的 ‘蜗牛壳’ 试试看!”

      这我就我想不明白了……我原以为在Python里常用的交通工具比如set、tuple、list、dict这些,我都了解它们了,也自以为我的代码可以上天下海无所不能了,结果,其实它还是一只驮着壳的小蜗牛,和蟒蛇没法比啊。

      夜猫兄的键盘响起,程序变成了下面这样。

     1 # !/usr/bin/env python3
     2 # -*- coding=utf-8 -*-
     3 import timeit
     4 import random
     5 
     6 def func_use_set():
     7     N = 5000
     8     numbers = set(range(N))
     9     for number1 in numbers:
    10         _ = random.randint(0, N-1) in numbers
    11 
    12 def func_use_tuple():
    13     N = 5000
    14     numbers = tuple(range(N))
    15     for number1 in numbers:
    16         _ = random.randint(0, N-1) in numbers
    17 
    18 def func_use_list():
    19     N = 5000
    20     numbers = list(range(N))
    21     for number1 in numbers:
    22         _ = random.randint(0, N-1) in numbers
    23 
    24 
    25 if __name__ == '__main__':
    26     print('list:', timeit.timeit(stmt=func_use_list, number=10), 's')
    27     print('tuple:', timeit.timeit(stmt=func_use_tuple, number=10), 's')
    28     print('set:', timeit.timeit(stmt=func_use_set, number=10), 's')

      “现在再来猜猜,猜对有奖哦~”夜猫兄坏笑起来,那样子真诡异,像爱丽丝梦游仙境里那只妙妙猫。

      “我……我……我……哇啊……”我变成了王司徒,直接摔下马去。程序的结果:

    1 list: 2.305914190999829 s
    2 tuple: 2.242317064999952 s
    3 set: 0.49790156399831176 s

      嗯,这次set终于争了一次光,以超过4倍的成绩把tuple和list斩于马下。试了好几次,tuple确实总比list快一点,不过还是在 “≈” 的水准。

      “明白了吧。”夜猫兄嘿嘿一笑。

      “明白什么?等你讲解啊……”我又开始迷惑了。

      “还讲啥?实践出真知啊。我不知道别人那怎么样,不过我这测试的结果就是这样,你也可以去尝试别的方法,或许还可以推翻我的结论。总体来讲,set因为有哈希表,所以查找操作极快,但是遍历的话就不行了。把‘查找’和‘遍历’区分开,‘快’是有条件的,要付出代价,比如set不能存放相同的数据。”

      “哦哦哦,学到了。不过……嘿嘿,我还是缩进蜗牛壳里睡觉去吧……”我打个哈欠,“我不是夜猫,我得睡觉了。”

      “哼,难成大器!”

      深夜Python,第2夜,2019.10.19。

  • 相关阅读:
    xadmin进行全局配置(修改模块名为中文以及其他自定义的操作步骤)
    xadmin邮箱验证码 标题 EmailVerifyRecord object
    Django源码安装xadmin报错Apps aren't loaded yet.
    python虚拟环境virtualenv下安装MySQL-python(1.2.3)
    Pycharm界面的子窗口不见了,怎么办?
    MySQL-python终于安装成功了
    mysql-python 安装错误: Cannot open include file: 'config-win.h': No such file or directory
    配凑法
    双连不等式
    求参数的取值范围
  • 原文地址:https://www.cnblogs.com/adjwang/p/11689402.html
Copyright © 2020-2023  润新知