前言
Easy Python终于来到完结,我的领导也夸奖我写作非常的卖力用心。对此,我深表欣慰!
六章Python讲解,并不单纯是切磋代码技艺,而更是注重于每一行代码背后发生的事儿
为此,让我们一起重回首Easy Python系列,光荣收尾吧!
前段时间,我和我的领导回到了母校,和我的师父师母聚餐。聚餐点了很多东西,大碗宽面,牛肉炒饭,韩国烤肉,吃都吃不完。虽然我的领导最近长得比以前p了些,但是吃饭速度还是慢悠悠。唉,要是我的领导能有个三头六臂,每个手都夹菜,每个头都去啃,那吃饭速度可就蹭蹭地涨上去了啊!
人无法三头六臂,但在Python里,我们可以做到。
要想实现三头六臂的效率,不走单一顺序流,我们不仅需要让多个任务能够并发(Concurrent),还能够并行(Parallel)运作。
假使吃饭吃到一半,人有三急,摘花回来继续用膳,那么如果把“吃饭”与“解手”当作两个任务,那么它们便是便是并发运作,但不并行。如果太追求效率,蹲坑恰饭,那便即是并发,也是并行了。
在Python中,我们可以用三种方式实现并发。但是并不是所有的方法,都支持并行。
这三种方法是:
最近一直在探索Lua的C API编程部分,上次实现了一个函数执行时间统计库:lfunctimer,这次就果断写了一个lnodelist来玩玩。在这期间,遇到了许多纠结的问题,因此果断做下分享~
测试用例现在贼少= =想要试用的同学可以走lnodelist的Github传送门,或者luarocks install lnodelist,就可以开始干起~
在Lua里,table充当着array以及hashmap两个角色,提供了简单的insert、remove、concat等功能。lnodelist则是独立于table之外建立一个崭新的list/array数据结构,暂时是一个双向链表。API的需求上,则兼并java的LinkedList跟js的array两种体系,列表如下:
数据挖掘(Data Mining),一般指从海量抓取的数据中经过一定的数据处理、算法,从而提取出有价值的信息的过程。它大体基于统计学、机器学习(Machine Learning)等原理,辅佐了人类的信息处理工作,为人工智能(AI)铺下道路。
幸运的是,似乎正是因数据挖掘而生的那样,Python社区中有各种数据挖掘相关的package,能够满足各种数据处理与算法模型构建需求。我们只需要pip/conda install 包名,然后查查api文档,熬几十行代码,就能玩一玩数据挖掘。
为此,在这一话,我们以自然语言处理(NLP)的文本分类(Text Classification)为例,设计一个最simple的,最old school的,以Python为例的,从数据获取到产生数据挖掘结果的流程。
昨天更新了一下lfunctimer,主要把hook更改为c api的形式,并且初步加了util和config的扩展
想要试用的同学的话可以点击上面clone下来,或者安装luarocks后执行下面命令安装~
luarocks install --server=http://luarocks.org/manifests/utmhikari lfunctimer
言归正传,利用lua原生的c api做debug相关操作会比lua自带的debug.getinfo来的快许多,我们可以来一探究竟
我们可以从官方下载源码搜索debug.getinfo的实现,此处以版本5.3.5为例。
debug.getinfo对应的源码是ldblib.c的db_getinfo函数,我们可以简单在ldblib.c的末尾中查到~
一直以来,爬虫都是许多同学学Python的目的之一,就连我敬爱的领导,也经常不耻下问一些爬虫方面的问题。因此,我们开始实战——以豆瓣Top 250为例,试水一下基础的爬虫。
“玩转豆瓣二百五”系列分为上下两部,所有代码,可以在我的Github里Douban_250找到~
工欲善其事,必先利其器。以下浏览器操作,都基于最新版Chrome~
爬虫爬虫,实质还是抓取网络数据= =爬虫不得急,可要一步步来——首先,我们希望获得每一个电影的链接,把它们存起来,留着后续爬取具体内容备用。
打开豆瓣Top 250首页,会看到电影列表的页面,往下翻,会看到总共有10页,每页25个电影。打开第二页,可以看到浏览器的地址变成了https://movie.douban.com/top250?start=25&filter=,咱们观察一下链接——链接有一部分,start=25,是不是很突兀?按这样推算,第三页应该是start=50,第一页就是start=0嘛= =试了一下,果真是的= =
因此,爬取250个电影链接,不难规划。具体如下:
在白盒性能测试(profiling)中,函数时间统计是一项重要的指标。对于整个以lua为基础的系统架构而言,函数时间统计数据是性能优化的直接参照。
因此,本次Lua杂谈,将会分享一种函数执行时间统计的实现~
单个函数执行时间的获取相对较为简单,例子如下:
1 | local function test() |
在函数的开头与结尾调用lua内置的os.clock(内核实现为time.h的中clock()时间戳除以CLOCKS_PER_SEC统计量,单位为秒),可以轻而易举地获得该函数的执行时间
学python的时候,我们一定会接触到dict(字典)这个数据结构。
dict结构展示了数据间(key与value)一一对应的关系,key作为一个查询索引,是不允许有重复的,而不同key所对应的value,则允许重复值的存在。
比如说,我们定义一群boys&girls,打出整个dict,再打出girls有哪些,可以这样操作:
1 | import pprint |
打出来的效果是:
1 | {'boy': ['大碗宽面'], 'girl': ['迪丽热巴', '王鸥', '鬼鬼']} |
我们可以很直观地看到这种对应关系
像dict数据结构给我们展现的一样,数据间的对应关系,我们可以统称为:映射(Mapping)
如同第一话所说,程序的本质即为输入->函数->输出。输入和输出,就是一种映射关系,而实现这种映射的规则,就是函数。在dict里面,实现映射的函数,可以简化如下: