深夜Python - 第2夜 - 爬行

深夜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。

原文地址:https://www.cnblogs.com/adjwang/p/11689402.html

时间: 2024-11-04 22:42:01

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

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

深夜Python - 第1夜 - for 迷 in 迷思 在一个月黑风高的夜晚,我悄悄打开编辑器,进入程序的世界.刚刚学会Python的我,由于一段时间的过度装B,被委托优化一段程序,我信心十足地接下来,看了又看……这不挺好的程序吗?但是又觉得哪不太对,无奈,只好去找夜猫兄. “夜猫兄!速救!——”我敲门敲出了过年放烟花般的氛围.夜猫兄刚刚起床,瞅瞅我的程序,然后瞅瞅我,一脸鄙夷:“这……是你写的?” “这是……其实是β兄的原创……”我感觉不妙…… “真差!”夜猫兄只说了这2个字. “啥啥啥?”

修电脑

从小不学好,长大修电脑.举头望明月,低头修电脑.春眠不觉晓,醒来修电脑.生当做人杰,死亦修电脑.远上寒山石径斜,寒冬深夜修电脑.夜夜思卿不见卿,原来卿在修电脑.诸位朋友如相问,就说我在修电脑.三十功名尘与土,一万月薪修电脑.垂死病中惊坐起,今天还要修电脑.人生自古谁无死,来生继续修电脑.众里寻他千百度,蓦然回首,那人正在修电脑    电脑万岁

Python 爬行Twitter用户的Friendship图

CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-1 @author: guaguastd @name: crawing_friendship_graph.py ''' if __name__ == '__main__': # import json #import json # import search from search import search_for_tweet # import get_f

6月29日云栖精选夜读:Java、PHP、Python、JS 等开发者都如何绘制统计图

原文链接 目前很多程序员绘图基本上都是采用后端生成数据传递给前端,然后前端将数据渲染到绘图库上面进行显示,从而得到我们最后看到的各种图,但是有时候,我们发现需要传递的数据很多很多,那么这个时候如果将数据传递给前端进行分析并展示的话是非常慢的,所以有必要在后端进行各种统计图的生成,下面我们就来聊聊各种程序员都是怎么进行图制作的? 热点热议 Java.PHP.Python.JS 等开发者都如何绘制统计图 作者:琴瑟琵琶 程序员:感觉技术停滞时,该怎么办? 作者:琴瑟琵琶 Linux 之父 Linus

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

深夜,我用python爬取了整个斗图网站,不服来斗 QQ.微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,不服来斗. 废话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构 网页信息 从上面这张图我们可以看出,一页有多套图,这个时候我们就要想怎么把每一套图分开存放(后边具体解释) 通过分析,所有信息在页面中都可以拿到,我们就不考虑异步加载,那么要考虑的就是分页问题了,通过点击不同的页面,很容易看清楚分页规则 很容易明白分页URL的构造,图片链接都在源码中,就不做具体说明了明白了这

『Python』爬行搜索引擎结果获得指定主机所有二级域名

0x 00 前言 前天自己在玩的时候,自己通过百度搜索主机的二级域名感觉好麻烦,自已要一页页的去翻 而且人工识别是否是重复的二级域名也够蛋疼的,正好最近在学正则表达式,权当练手了 0x 00 代码 # coding=utf-8 # author:Anka9080 import urllib import urllib2 import cookielib import re url = 'http://www.haosou.com/s?src=360sou_newhome&q=site:tjut.

Python网站爬行神器requests的简单安装(适合新手)

requests是Python的一个HTTP客户端库,跟urllib,urllib2差不多,那我们为什么要用requests呢?采用官方的说是:python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码. 下面是requests的安装步骤: 我们这里直接用pip安装(这样比较适合新手),新版python自带pip,python2.7.13下载地址:https://www.python.org/ftp/python/2.7.13/pytho

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

背景: 刚开始学习scrapy爬虫框架的时候,就在想如果我在服务器上执行一个爬虫任务的话,还说的过去.但是我不能每个爬虫任务就新建一个项目吧.例如我建立了一个知乎的爬行任务,但是我在这个爬行任务中,写了多个spider,重要的是我想让他们同时运行,怎么办? 小白解决办法: 1.在spiders同目录下新建一个run.py文件,内容如下(列表里面最后可以加上参数,如--nolog) 2.小白想了(当时的我),这样也行,mygod,那我岂不是多写几行就行就行了么,结果(结果白痴了),小白又想,那加个

Python获取全网电影,深夜有小电影看难道不是你学习的初衷吗?

你以为这是×××?NO,这只是简单的Python爬虫.如今各种各样的影视Vip收费出现在我们的视野中,对于我们来说也许是一部期待已久的电影电视,可是对于网站,App开发人员来说只是一组数据,为了一组数据去付费.等广告时间,我觉得还是有所不值的!对于普通人来说也没多少钱,就充值了,然而对于我们Python开发人员是不可能的,爬虫如此简单,自己本身就是Vip. 抓取一个影视网站,把所有的资源为己所用,使用python写一个多线程的爬虫.用到的第三方模块: 1 . requests2. Beautif