一、分布式数据挖掘必要的基础知识准备
1、基础的第三方库
1.1 urllib2 1.2 pyspark 1.3 protobuf 1.4mongodb 1.5mysql
注意:1、protobuf工具就是一个把协议进行打包,把协议变成一个序列化数据(stub-桩代码),通过tcp、http把打好包的数据传到目标对象。 2、序列化数据可以用在用两种不同的语言写出来的系统之间进行通信(比如:python和java写的两种系统之间) 3、序列化就是对协议进行打包。
2、开发环境
2.1 Pycharm IDE
主流的python集成环境
2.2 依赖项和包管理工具
2.2.1 Anaconda (https://www.anaconda.com/download/#macos)
进入pycharm 环境,File->setting->Project: xxxx->设置->新建local->选择anaconda对应的python 解释器
切记选择inherit global site-packages 选项
完成以后可以找到anaconda 自带的package
2.2.2 pip
Pypi 托管的源,可以使用sudo pip install xxx 命令安装软件(cython、pypi、jython 是什么?)
1、cython
1.1 cython简介
python作为一门强大的脚本语言,优势自然不必说。但是,当我们的模型较复杂,运算量较大的时候,python的短板就会出现,就是运算速度慢。当然,解决这一问题有很多方法,比如pypy的jit技术,但是抛开稳定性不提,使用pypy有很多限制,而且不是那么工程化。所以,向大家介绍Cython,方便将别的应用场景中的一些重计算的部分单独取出来,然后用Cython改写,独立成模块来提高运算速度。
首先,大家都知道,C语言是编译性语言,而Python则是解释性语言,简而言之,就是Python运行是逐行运行,不需要实现编译,而C需要在运行前编译。那么,可想而知,如果运行前,需要事先编译,那么其实有一种“上帝视角”的感觉,自然可以做很多优化,让代码运行的更快。而Cython的出现就是这个目的,让Python也可以被编译,然后执行。Cython是一种部分包含和改变C语言,以及完全包含pyhton语言的一个语言集合。Cython是用Python实现的一种语言,可以用来写Python扩展,用它写出来的库都可以通过import来载入,性能上比Python的快。Cython里可以载入Python扩展(比如 import math),也可以载入C的库的头文件(比如:cdef extern from “math.h”),另外也可以用它来写Python代码。将关键部分重写成C扩展模块。Cython中的强大之处在于可以把Python和C结合起来,它使得看起来像Python语言的Cython代码有着和C相似的运行速度。
1.2、cython的helloworld
首先我们要知道,cython的文件后缀是.cyx,而且既然cython是python语言的一个超集,那么,cyx里面运行纯python文件也是没有问题的了。pyx文件只是Cython源代码文件,要想被python调用运行,还要转成c\c++的文件,再进一步转成.pyd文件(window系统)或者.so文件(Linux系统)。.pyd和.so文件才是可以直接在python文件中import使用的文件。
编译经过两个阶段:
* Cython编译.pyx文件为.c文件;
* C编译器会把.c文件编译成.so文件(Linux系统)或者.pyd文件(Windows系统);
我们新建一个hello.pyx文件,在里面输入:
def hello():
print ("Hello World")
没有任何特殊,然后我们新建一个setup.py脚本,这个python文件的目的就是使用cython编译器去编译pyx折一个cython文件。setup.py文件的代码很简单:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("hello.pyx")
)
然后我们运行一下setup.py文件:
python setup.py build_ext --inplace. build_est
大概就是编译extension文件的意思,inplace则是放到源代码pyx旁边,也就是同一目录下的意思。然后,我们就可以看到多了两个文件,一个是hello.c一个是hello.so(Linux系统)或者hello.pyd(windows系统)。这里,c文件就是cython将我们的pyx文件解析成一个c文件件,不依赖与平台,而后面的so或者pyd文件,则是将c文件进行编译后的一个文件,依赖于平台。这个时候,so文件或者pyd文件就可以像普通的python文件一样,被import。
2、jython
2.1 jython简介
Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。
2.2.3 Virtualenv
virtualenv 是一个创建隔绝的Python 环境的工具。virtualenv 创建一个包含所有必要的可执行文件的文件夹,用来使用Python 工程所需的包。大项目时强烈推荐使用虚拟环境避免由于依赖的package 版本冲突带来的问题。
新建一个空的项目:
1、选择Virtualenv 环境
2、不要勾选inherit global site-packages
发现只有原生的几个package
3、工程规约
3.1 开发环境
研发工程师在本机搭建的环境,用于代码编写。环境包括项目需要对应版本的第三方包;
功能开发完成以后需自行编写单元测试用于纠错。
3.2 测试环境
测试人员对代码进行全流程测试,工作主要是编写自动化测试脚本,从系统层面检查功能是否正常、系统性能、代码覆盖等指标;可以通过Jenkins 等CI 工具触发自动化检测流程,通过检测以后可以部署到测试环境;
3.3 生产环境
公司对外提供服务的环境,包括软硬件等系统;
3.4版本控制
推荐使用Git 实现文本版本控制,团队协同开发可以使用github 的私有仓库或者gitlab 自行搭建;
4、来自Google 的序列化框架Protobuf
安装protobuf 编译器:
conda install protobuf=3.6.0
网络协议:
利用pb 编译器自动生成代码:
protoc --python_out=. person.proto