作者 |Andy Reagan
编译 |VK
起源 |Towards Datas Science
在 MATLAB 和数值计算的世界,for 循环被剪掉,而向量为王。
在我的博士学位期间,Lakoba 传授的数值剖析课是我加入的最具挑战性的课程之一,在课程之后,我对向量代码有了粗浅的了解。
我最喜爱的向量化例子是,一位共事在写了一篇十分酷的论文,对其中所波及的大量计算做了脚注,与我分享了他的 lorenz96 代码。其中,外部的向量化速度比没有向量化快了 4 倍。
当初,疾速向量代码使机器学习成为可能。例如 QR 合成,尽管我还没做过,但我确信当初我能够用 MATLAB 或 Numpy 或 Julia 编写。
我在 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/