Pandas Getting Performance

http://pandas.pydata.org/pandas-docs/version/0.24/user_guide/enhancingperf.html?highlight=performance

For intensive ndarray computing (loops): - use cython with numpy - use numba with numpy

在引入更复杂的基础设施(如k8s、多进程)等方式之前,先使用算法、语言级别的性能优化。而在执行优化之前,先应该找到瓶颈。既可以使用小代码片段和模拟数据来验证代码(或算法)的性能,或小规模数据使用profile来看,也可以往代码中加入时间开销打印输出等方式来寻找(尤其是在函数体内)。

比如,我在做MCS的统计分析时,一开始猜测是df的loop开销大,花了力气优化。但后来按步骤,先加入时间开销打印语句,找出来时间开销是在df.loc[i,j …

Continue Reading

2017年 Instagram 把 Python2 升级到了 Python3

Instagram是特别流行的图片和视频分享社交平台,有超过6亿的注册用户,每天有超过4亿的活跃用户。因此,它是一个特别大规模的计算平台。它的主要开发语言是Python。Instagram是世界上最大的Python用户。

像PHP一样,Python也是属于入门容易的语言。最初Instagram选择Python的原因,和其他创业公司的技术选择一样,主要是因为初始团队的技术骨干很熟悉某种技术。而且Python也是很适合快速开发的语言。快速推出功能,比运行速度快要更重要。在架构合理的情况下,运行性能的问题可以通过添加服务器来缓解。

Python的运行慢的确给Instagram带来了服务器运营成本上的增加,他们也确实想过换成其他语言。Instagram属于Facebook,公司的另外一个主流语言是PHP。在调研时,把试点模块用PHP改写后,性能并没有特别大的改善。再加上Instagram的技术团队特别喜欢(熟悉)Python。于是他们改变了态度,与其抱怨,不如积极改善。既然决定了继续留在Python阵营,那么就要跟随Python社区,使用最新版本的Python,并回报社区。全面升级到Python3成了顺理成章的事情(Python3相对于Python2有很多新的特性)。

Python2与Python3并不兼容。Instagram前后花了近一年(10个月)的时间,通过小步快跑的方式,在不影响用户的情况下完成了迁移。

迁移过程中,他们主要做了哪些工作呢?

第一阶段,约3个月时间,大规模的代码修改,以及替换掉不兼容的第三方库。

第二阶段,约2个月时间 …

Continue Reading

Python中模块的循环引用

一般来说,在Python中模块的循环引用不是什么好的代码风格。但有时候这很难避免。比如有两个模块a和b,各表达一个业务逻辑,随着业务的发展,a开始依赖于b,因此,在a中引入了模块b,且在a的代码中大量引入了b的调用;后来,业务继续发展,b中也需要调用使用a的逻辑,两个业务有交叉关联关系。消除两个模块的循环依赖优先级并不高。

在 Python 3.5 时,还支持了 relative import。该问题的提出是在 relative import circular problem, 且解决方案为 Modify IMPORT_FROM to fallback on sys.modules 。Relative import 指的是 from a import b 这种形式的模块import。

Relative import的逻辑在 __import__ 中很早就实现了,但 IMPORT_FROM …

Continue Reading

Ubuntu 14.04 中升级到 Python 3.5/3.6

Ubuntu 14.04 官方的Python版本最高到Python 3.4,但是我们的代码开发环境是 Python 3.6, 代码中存在支持模块的循环相对引用,该功能在 Python 3.5 才引入,因此我们需要升级Python。

我们可以自己下载源代码,编译该版本的Python。但更方便的办法是使用一个知名的第三方包。在Ubuntu中,这是很常见的办法,其协议是 ppa。知名的 Python3.5, 3.6 ppa源是 fkrull/deadsnakes。

sudo add-apt-repository ppa:fkrull/deadsnakes
sudo apt-get update
sudo apt-get install python3.6

or use pyenv https://askubuntu …

Continue Reading

Python 计算金额

由于浮点数的二进制转换会丢失精度,对于金额的存储与计算,一般用Decimal十进制编码类型。

有两个问题需要考虑,一是舍入规则,二是保留小数点后几位。默认情况下是四舍五入,保留两位小数。

Decimal 的 quantize 方法能处理数字保留几位小数点的问题。

price = Decimal('8.014')
price2 = price.quantize(Decimal('.00'))
# price2: 8.01
balance = Decimal('200.105')
balance2 = balance.quantize(Decimal('.00'))
# balance2: 200.11

Continue Reading