深夜Python - 第2夜 - 爬行

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

  “呵,英语不错啊。”

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

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

 # !/usr/bin/env python3
# -*- coding=utf-8 -*-
import timeit def func_use_set():
N = 1000
numbers = set(range(N))
for number1 in numbers:
for number2 in numbers:
pass def func_use_tuple():
N = 1000
numbers = tuple(range(N))
for number1 in numbers:
for number2 in numbers:
pass def func_use_list():
N = 1000
numbers = list(range(N))
for number1 in numbers:
for number2 in numbers:
pass if __name__ == '__main__':
print('set:', timeit.timeit(stmt=func_use_set, number=10), 's')
print('tuple:', timeit.timeit(stmt=func_use_tuple, number=10), 's')
print('list:', timeit.timeit(stmt=func_use_list, number=10), 's')

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

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

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

  “没啊,网友说的。”

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

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

 set: 0.5598647409997284 s
tuple: 0.5289756949996445 s
list: 0.4945050540000011 s

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

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

 list: 24.5941286340003 s
tuple: 24.454961858999923 s
set: 26.473167070000272 s

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

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

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

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

 # !/usr/bin/env python3
# -*- coding=utf-8 -*-
import timeit
import random def func_use_set():
N = 5000
numbers = set(range(N))
for number1 in numbers:
_ = random.randint(0, N-1) in numbers def func_use_tuple():
N = 5000
numbers = tuple(range(N))
for number1 in numbers:
_ = random.randint(0, N-1) in numbers def func_use_list():
N = 5000
numbers = list(range(N))
for number1 in numbers:
_ = random.randint(0, N-1) in numbers if __name__ == '__main__':
print('list:', timeit.timeit(stmt=func_use_list, number=10), 's')
print('tuple:', timeit.timeit(stmt=func_use_tuple, number=10), 's')
print('set:', timeit.timeit(stmt=func_use_set, number=10), 's')

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

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

 list: 2.305914190999829 s
tuple: 2.242317064999952 s
set: 0.49790156399831176 s

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

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

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

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

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

  “哼,难成大器!”

  深夜Python,第2夜,2019.10.19。

深夜Python - 第2夜 - 爬行的更多相关文章

  1. 深夜Python - 第1夜 - for 迷 in 迷思

    深夜Python - 第1夜 - for 迷 in 迷思 在一个月黑风高的夜晚,我悄悄打开编辑器,进入程序的世界.刚刚学会Python的我,由于一段时间的过度装B,被委托优化一段程序,我信心十足地接下 ...

  2. 【日语】日语单词N3_N4_N5

    日语单词N3_N4_N5 单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. ...

  3. 日语单词N3_N4_N5

    单 词 讲 解 あ行单词 ああ:0[副]那样.那种 例句:ああ言うことはしないほうがいい.那样的事情最好不做. 電車の窓からごみを棄てているああ言うことはしないほうがいい. 挨拶(あいさつ):① 寒暄 ...

  4. 女朋友让我深夜十二点催她睡觉,我有Python我就不干

    事情是这样的:今天晚上,女朋友让我十二点催她睡觉. 不过,可是我实在太困了,熬不下去-- 是吧?女朋友哪有睡觉重要? 但,女朋友的命令,我是不敢违抗的-- 但是睡觉也不能缺! 这时候我们该怎么办呢?是 ...

  5. 『Python』爬行搜索引擎结果获得指定主机二级域名及IP信息

    0x 00 前言 前天自己在玩的时候,自己通过百度搜索主机的二级域名感觉好麻烦,自已要一页页的去翻 而且人工识别是否是重复的二级域名也够蛋疼的,正好最近在学正则表达式,权当练手了 0x 00 代码 # ...

  6. python爬虫scrapy之如何同时执行多个scrapy爬行任务

    背景: 刚开始学习scrapy爬虫框架的时候,就在想如果我在服务器上执行一个爬虫任务的话,还说的过去.但是我不能每个爬虫任务就新建一个项目吧.例如我建立了一个知乎的爬行任务,但是我在这个爬行任务中,写 ...

  7. Ubuntu下一个python的BeautifulSoup和rsa安装方法---信息检索project2部分:微博爬行要求python包裹

    后果<信息检索>第二project,微博具有抓取数据,再处理.师兄给了代码.让慢慢爬.可是在ubuntu下.少了非常多python软件包.须要安装. 1.首先执行时.说少了python.B ...

  8. python夜记

    关于多行字符串(multi-line strings)的表现: Python列表是基于0索引的.(zero-indexed). 晌午起床来嘞,再来些笔记: Treasures 1: 列表方法rever ...

  9. 深夜,我用python爬取了整个斗图网站,不服来斗

    QQ.微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,不服来斗. 废话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构 网页信息 从上面这张图我们可以看出,一页有多套图,这个时候我们 ...

随机推荐

  1. leetcood学习笔记-39-组合总和

    题目描述: 方法一: class Solution: def combinationSum(self, candidates, target): """ :type ca ...

  2. Yii2配置

    最外层:配置文件,params Yii2导航 <?php NavBar::begin([ 'brandLabel' => '大海', 'brandUrl' => Yii::$app- ...

  3. 【Codeforces 1185C2】Exam in BerSU (hard version)

    [链接] 我是链接,点我呀:) [题意] 要让前i个数字的和小于等于M. 问你最少要删掉前i-1个数字中的多少个数字,每个询问都是独立的. [题解] ti的范围很小. 所以N*MAX(TI)暴力枚举就 ...

  4. CF601C Kleofáš and the n-thlon(期望+前缀和优化dp)

    传送门 解题思路 要求这个人的排名,我们可以先求出某个人比他排名靠前的概率,然后再乘上\(m-1\)即为答案.求某个人比他排名靠前可以用\(dp\),设\(f[i][j]\)表示前\(i\)场比赛某人 ...

  5. VScode中写vue代码 Ctrl+/添加注释失效

    1.点击列表的文件——>首选项——>键盘快捷方式,在里面查看 Ctrl+/ 是否有冲突 2.查看右下角的选择语言模式是否是Vue,如下图

  6. oracle一体机(exdata)创建ACFS文件系统

    ACFS是一个支持多个平台,可扩展的,基于ORACLE ASM的集群文件系统,可以用来存储数据库和各种应用的文件,包括数据库的trace文件,alert日志文件和配置文件等等,也可以用来存储视频,音频 ...

  7. nginx分布式实例入门操作

    本文目的 前段时间学习WCF已经渐入佳境,完成了既定学习目标,转入分布式系统学习.本文技术路线是: 采用wcf实现分布式服务端和客户端,客户端部署于本地主机,nginx和WCF部署于虚拟机端(分别是三 ...

  8. 剑指offer——30栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  9. 刚装完Linux就CPU占用率高

    top命令发现如下三个进程占据了前三的CPU使用率 wpa_supplicant NetworkManager rsyslogd google发现前两个进程与无线网络有关,我的电脑是笔记本,插的有线, ...

  10. 面向对象编程思想(OOP)总结

    本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...