【Python】疯狂的加速函数!
机器学习初学者
共 1693字,需浏览 4分钟
·
2022-02-12 13:20
einsum函数
在平时的工作中,包括时间序列等的建模中,我们常常会涉及到线性或者Multilinear代数的计算,很多时候包括我在内也喜欢偷懒使用numpy来处理,个人觉得还是可以的,但有的朋友觉得这个看起来可读性会差一些,并且速度上也差一些,今天就推荐一个新的函数einsum
函数。
通过einsum
函数,我们可以写出可读性更好,更加高效的函数。
关于einsum函数
einsum函数一般会用于向量,矩阵,张量的计算中。
如果输入的是标量(scalar),我们就可以空着,因为它没有下标。
einsum函数优势
1.速度优势
因为numpy很多是用C写的。
如果我们使用Python循环时,所有数据操作都在Python解释器中进行。
当使用内置numpy函数时,它发生在C中,这就是numpy速度更快的原因。
使用einsum时,numpy会在C中处理数据一次并返回最终结果,而使用多个numpy函数会花费更多时间返回多个值。
2.可读性优势
einsum的代码可读性会更强,能大大提高代码的可读性和效率。
比较循环,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
所有涉及到矩阵,向量,张量等计算的问题。
Write Better And Faster Python Using Einstein Notation
往期精彩回顾
适合初学者入门人工智能的路线及资料下载 (图文+视频)机器学习入门系列下载 中国大学慕课《机器学习》(黄海广主讲) 机器学习及深度学习笔记等资料打印 《统计学习方法》的代码复现专辑 AI基础下载 机器学习交流qq群955171419,加入微信群请扫码:
评论
一份让Python疯狂加速的工具合集!
- 点击上方“i小码哥”设置⭐星标不迷路!-小橡皮 | 作者知乎专栏 | 来源https://zhuanlan.zhihu.com/p/31044229这篇文章会提供一些优化代码的工具。会让代码变得更简洁,或者更迅速。当然这些并不能代替算法设计,但是...
i小码哥
0
加速Python for循环
(点击上方快速关注并设置为星标,一起学Python)来源丨deephub在本文中,我将介绍一些简单的方法,可以将Python for循环的速度提高1.3到900倍。Python内建的一个常用功能是timeit模块。下面几节中我们将使用它来度量循环的当前性能和改进后的性能。对于每种方法,我们通过运行测
i小码哥
0