向量化代码

做者|Andy Reagan
编译|VK
来源|Towards Datas Sciencepython

在MATLAB和数值计算的世界,for循环被剪掉,而向量为王。git

在个人博士学位期间,Lakoba教授的数值分析课是我参加的最具挑战性的课程之一,在课程以后,我对向量代码有了深入的理解。github

我最喜欢的向量化例子是,一位同事在写了一篇很是酷的论文,对其中所涉及的大量计算作了脚注,与我分享了他的lorenz96代码。其中,内部的向量化速度比没有向量化快了4倍。数组

如今,快速向量代码使机器学习成为可能。例如QR分解,虽然我还没作过,但我确信如今我能够用MATLAB或Numpy或Julia编写。app

我在MassMutual作的不少工做基本上都是数值计算,一条耗时数小时与耗时数秒的管道之间的差别巨大。秒意味着咱们能够迭代,尝试更多的选项。不过,为了灵活性,不少数值代码都是用纯Python(没有Cython,没有Numba)编写的。我要说这是个坏想法!下面是一封同事的转述邮件:机器学习

在伪代码中,这是几个月前我遇到的“精算”编码难题:

EOM = 0
for months in years:
PREM = 50
BOM = EOM + PREM
WIT = 5
EOM = BOM – WIT函数

一个简单的例子,可是我认为显示了BOM/EOM的相互依赖性(还有一些其余变量具备类似的关系)。你不能在不知道EOM的状况下对BOM进行向量化,并且在知道BOM以前也不能对EOM进行向量化。若是WIT>0,PREM=0。基本上会出现不少相互依赖的状况。如今不少函数都不容易出现向量化。性能

好吧,我能够向量化这个,我作到了。如下是Python中的非向量化版本:学习

import numpy as np
years = 10
bom = np.zeros(years*12)
eom = np.zeros(years*12)
for month in range(1, years*12):
    prem = 50
    bom[month] = eom[month-1] + prem
    wit = 5
    eom[month] = bom[month] - wit

这是向量化版本:编码

import numpy as np
years = 10
prem = 50
wit = 5
eom = np.arange(years*12)*prem - np.arange(years*12)*wit
# 若是你仍但愿将bom表做为数组:
bom = eom + np.arange(years*12)*wit

我还经过使用一系列字典来编写for循环:

years = 10
prem = 50
wit = 5
result = [{'bom': 0, 'eom': 0}]
for month in range(1, years*12):
    inner = {}
    inner.update({'bom': result[month-1]['eom'] + prem})
    inner.update({'eom': inner['bom'] - wit})
    result.append(inner)

上面的这个返回一个不一样类型的东西,一个dict列表…而不是两个数组。

咱们还能够导入Pandas来填充上述三个结果的结果(所以它们是一致的输出,咱们能够保存到excel中,等等)。若是加载了Pandas,则可使用空数据帧进行迭代,所以还有一个选项:

import numpy as np
import pandas as pd
years = 10
prem = 50
wit = 5
df = pd.DataFrame(data={'bom': np.zeros(years*12), 'eom': np.zeros(years*12)})
for i, row in df.iterrows():
    if i > 0:
        row.bom = df.loc[i-1, 'eom']
        row.eom = row.bom - wit

对于全部这些类型的迭代,以及返回数据帧做为结果的选项,咱们获得的结果是:

Cython 和Numba

我还添加了一些Cython版本的代码,说明使用C能够在不使用numpy的状况下得到向量化的性能,这确实可能在可读性还有速度之间达到最佳平衡(保持for循环!)。

Numba也能够加速(它可能和Cython/Vectorized Numpy同样快)。在这两种状况下(Cython/Numba),你必须当心使用哪些数据类型(由于没有dicts或pandas!)。我认为,若是你对如何集成Cython+Numpy循环更聪明的话,它将有可能使Cython+Numpy循环与向量化Numpy同样快。

全部代码,包括Cython,均可以在这里找到:https://github.com/andyreagan...

原文连接:https://towardsdatascience.co...

欢迎关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官方文档:
http://sklearn123.com/

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

相关文章
相关标签/搜索