【Python】疯狂的加速函数!

作者:杰少

einsum函数

简介

7acb1f81d7dd42590c79a17a10ba4ce7.png

在平时的工作中,包括时间序列等的建模中,我们常常会涉及到线性或者Multilinear代数的计算,很多时候包括我在内也喜欢偷懒使用numpy来处理,个人觉得还是可以的,但有的朋友觉得这个看起来可读性会差一些,并且速度上也差一些,今天就推荐一个新的函数einsum函数。

通过einsum函数,我们可以写出可读性更好,更加高效的函数。

8f482956ac1277791b66512f1ff6c1a9.png

einsum函数

62c04b2f80d6ad4b8e6b1dd95c003207.png

01

关于einsum函数

einsum函数一般会用于向量,矩阵,张量的计算中。

6e8a29743986ca99bf57ad88ef7bff17.png

如果输入的是标量(scalar),我们就可以空着,因为它没有下标。

02

einsum函数优势

1.速度优势

因为numpy很多是用C写的。

  • 如果我们使用Python循环时,所有数据操作都在Python解释器中进行。

  • 当使用内置numpy函数时,它发生在C中,这就是numpy速度更快的原因。

  • 使用einsum时,numpy会在C中处理数据一次并返回最终结果,而使用多个numpy函数会花费更多时间返回多个值。

2.可读性优势

einsum的代码可读性会更强,能大大提高代码的可读性和效率。

代码

e15c50963ce898414c17dc1b4fb000cc.png

  • 比较循环,numpy中的其它函数,einsum

从下面的案例中,我们发现einsum比numpy快乐将近30倍,比循环快了500-600倍。

import numpy as np

A = np.random.rand(1000,1000)
B = np.random.rand(1000,1000)
%%time
# Using loops
s = 0
n, m = A.shape
for i in range(n):
    for j in range(m):
        s += A[i, j]*B[i, j] 
s

# CPU times: user 596 ms, sys: 5.79 ms, total: 602 ms
# Wall time: 607 ms
# 249760.77497519302
CPU times: user 596 ms, sys: 5.79 ms, total: 602 ms
Wall time: 607 ms
249760.77497519302
%%time
# Using built-in numpy functions
np.trace(np.dot(A.T, B))

# CPU times: user 113 ms, sys: 8.54 ms, total: 121 ms
# Wall time: 38.1 ms
# 249760.7749751993
CPU times: user 113 ms, sys: 8.54 ms, total: 121 ms
Wall time: 38.1 ms
249760.7749751993
%%time
# Using einsum
np.einsum('ij,ij->', A,B)

# CPU times: user 1.64 ms, sys: 689 µs, total: 2.33 ms
# Wall time: 1.19 ms
# 249760.7749751993
CPU times: user 1.64 ms, sys: 689 µs, total: 2.33 ms
Wall time: 1.19 ms
249760.7749751993

适用问题

ac656ef25c20e660e47d20a219393fd1.png

所有涉及到矩阵,向量,张量等计算的问题。

参考文献

4de69a6846a154cdeec7e746c6c97063.png

  1. Write Better And Faster Python Using Einstein Notation

 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

06383b67fc1322c554da378c317240bb.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值