HiKariのTechLab

光の技术屋


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 搜索

【Easy Python】第六话:multiprocessing——Python多进程并行

发表于 2019-05-11 | 更新于 2024-04-07 | 分类于 Easy Python

前言

前段时间,我和我的领导回到了母校,和我的师父师母聚餐。聚餐点了很多东西,大碗宽面,牛肉炒饭,韩国烤肉,吃都吃不完。虽然我的领导最近长得比以前p了些,但是吃饭速度还是慢悠悠。唉,要是我的领导能有个三头六臂,每个手都夹菜,每个头都去啃,那吃饭速度可就蹭蹭地涨上去了啊!

人无法三头六臂,但在Python里,我们可以做到。

并发&并行实验

要想实现三头六臂的效率,不走单一顺序流,我们不仅需要让多个任务能够并发(Concurrent),还能够并行(Parallel)运作。

假使吃饭吃到一半,人有三急,摘花回来继续用膳,那么如果把“吃饭”与“解手”当作两个任务,那么它们便是便是并发运作,但不并行。如果太追求效率,蹲坑恰饭,那便即是并发,也是并行了。

在Python中,我们可以用三种方式实现并发。但是并不是所有的方法,都支持并行。

这三种方法是:

阅读全文 »

【DIY小记】踏平Win10升级之坑——我们无法更新系统保留的分区

发表于 2019-05-01 | 更新于 2024-04-07 | 分类于 DIY小记

前言

前几天心血来潮,想把自己船上的Win10更新到18年10月的版本(1809),结果易升下载了更新之后,安装时提示“我们无法更新系统保留的分区”,于是一脸懵逼。

我们无法更新系统保留的分区

坑也是要慢慢踩的。熬了两夜,终于成功解决了这个问题,将Win10升级到了最新版本。

踩坑记录

原因分析

遇到这个问题后,笔者第一时间google百度了下解决方案,看到了以下几条:

阅读全文 »

【Lua杂谈】探索C API,开坑lnodelist

发表于 2019-04-20 | 更新于 2024-04-07 | 分类于 Lua杂谈

前言

最近一直在探索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两种体系,列表如下:

阅读全文 »

【Easy Python】第五话:小试scikit-learn数据挖掘——newsgroup数据处理与文本分类

发表于 2019-04-14 | 更新于 2024-04-07 | 分类于 Easy Python

前言

数据挖掘(Data Mining),一般指从海量抓取的数据中经过一定的数据处理、算法,从而提取出有价值的信息的过程。它大体基于统计学、机器学习(Machine Learning)等原理,辅佐了人类的信息处理工作,为人工智能(AI)铺下道路。

幸运的是,似乎正是因数据挖掘而生的那样,Python社区中有各种数据挖掘相关的package,能够满足各种数据处理与算法模型构建需求。我们只需要pip/conda install 包名,然后查查api文档,熬几十行代码,就能玩一玩数据挖掘。

为此,在这一话,我们以自然语言处理(NLP)的文本分类(Text Classification)为例,设计一个最simple的,最old school的,以Python为例的,从数据获取到产生数据挖掘结果的流程。

文本分类是什么?

阅读全文 »

【Lua杂谈】debug.getinfo源码分析——使用C API重写lfunctimer

发表于 2019-04-07 | 更新于 2024-04-07 | 分类于 Lua杂谈

前言

昨天更新了一下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源码分析

我们可以从官方下载源码搜索debug.getinfo的实现,此处以版本5.3.5为例。

debug.getinfo对应的源码是ldblib.c的db_getinfo函数,我们可以简单在ldblib.c的末尾中查到~

阅读全文 »

【Easy Python】第四话:爬虫初探——玩转豆瓣二百五(下)

发表于 2019-03-31 | 更新于 2024-04-07 | 分类于 Easy Python

前言

在上篇,我们获得了豆瓣二百五的电影URL,然后存储在了一个文件里。接下来,我们要访问每一个电影URL,深入敌后,获取情报~

所有的代码都已存储在我的Github仓库:Douban_250当中~

设置爬取规则

对于每一个电影,我们选择爬取如下内容(虽然电影列表页就能爬得到= =):

1
2
标题(title)、年份(year)、时长(time)、
导演(director)、类型(genre)、评分(score)

随意点击一个电影页面,用上篇所说的提取CSS选择器的方法,我们可以制作出每一种内容与内容提取规则的映射。如下所示:

阅读全文 »

【Easy Python】第三话:爬虫初探——玩转豆瓣二百五(上)

发表于 2019-03-31 | 更新于 2024-04-07 | 分类于 Easy Python

前言

一直以来,爬虫都是许多同学学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个电影链接,不难规划。具体如下:

阅读全文 »

【Lua杂谈】Lua性能测试:函数执行时间统计

发表于 2019-03-25 | 更新于 2024-04-07 | 分类于 Lua杂谈

前言

在白盒性能测试(profiling)中,函数时间统计是一项重要的指标。对于整个以lua为基础的系统架构而言,函数时间统计数据是性能优化的直接参照。

因此,本次Lua杂谈,将会分享一种函数执行时间统计的实现~

函数执行时间获取

单个函数执行时间的获取相对较为简单,例子如下:

1
2
3
4
5
6
local function test()
local start = os.clock()
...
local end = os.clock()
print(tostring(end - start))
end

在函数的开头与结尾调用lua内置的os.clock(内核实现为time.h的中clock()时间戳除以CLOCKS_PER_SEC统计量,单位为秒),可以轻而易举地获得该函数的执行时间

hook实现

阅读全文 »

【Easy Python】第二话:映射——输入、输出与函数的纽带

发表于 2019-03-16 | 更新于 2024-04-07 | 分类于 Easy Python

从dict开始说起

学python的时候,我们一定会接触到dict(字典)这个数据结构。

dict结构展示了数据间(key与value)一一对应的关系,key作为一个查询索引,是不允许有重复的,而不同key所对应的value,则允许重复值的存在。

比如说,我们定义一群boys&girls,打出整个dict,再打出girls有哪些,可以这样操作:

1
2
3
4
5
6
7
8
import pprint
d = dict()
d['girl'] = ['迪丽热巴', '王鸥', '鬼鬼']
d['boy'] = ['大碗宽面']
# 用pprint.pprint函数打印数据结构,使得其排版更加pretty~
pprint.pprint(d, indent=2)
# 单用pprint.pformat,可以返回一个排版过后的字符串,打印出来要额外print操作~
print('Girls are: %s' % pprint.pformat(d['girl']))

打出来的效果是:

1
2
{'boy': ['大碗宽面'], 'girl': ['迪丽热巴', '王鸥', '鬼鬼']}
Girls are: ['迪丽热巴', '王鸥', '鬼鬼']

我们可以很直观地看到这种对应关系

映射

像dict数据结构给我们展现的一样,数据间的对应关系,我们可以统称为:映射(Mapping)

如同第一话所说,程序的本质即为输入->函数->输出。输入和输出,就是一种映射关系,而实现这种映射的规则,就是函数。在dict里面,实现映射的函数,可以简化如下:

阅读全文 »

【Lua杂谈】解锁lua代码覆盖率测试:luacov源码分析

发表于 2019-03-10 | 更新于 2024-04-07 | 分类于 Lua杂谈

Lua 杂谈系列,就以代码覆盖率测试的 luacov 开头吧

简介

说到 lua 的覆盖率测试,我们一般都会想到用luacov做代码覆盖率测试
在干货|使用 luacov 统计 lua 代码覆盖率一文中,介绍了基本的 luacov 用法,但是缺少对 luacov 深入挖掘的相关内容。并且同时,原生的 luacov 提供了一套简洁的覆盖率测试实现以及报告输出形式,但是在实际许多场景中,采用原生 luacov 还是远远满足不了需求的
因此,本文旨在通过分析 luacov 的实现,帮助希望了解 lua 代码覆盖率测试或是使用、二次开发 luacov 的同学尽快上手

获取代码覆盖率数据

luacov 获取代码覆盖率数据,得益于 lua 自带的 debug 库。我们从 luacov 的主类 runner 中,可以一探究竟

阅读全文 »
1…181920
ひかり.HDQ

ひかり.HDQ

talk is cheap, code is rich
191 日志
14 分类
415 标签
GitHub Mail CSDN Juejin Steam Bilibili
© 2019 – 2025 ひかり.HDQ
|