JP *_*lav 16 python numpy vectorization python-3.x
在Python中矢量化for循环是什么意思?有没有其他方法来编写嵌套的for循环?
我是Python的新手,在我的研究中,我总是遇到NumPy库.希望可以有人帮帮我.
Dee*_*ace 22
Python for循环本质上比它们的C对应物慢.
这就是numpy在numpy数组上提供矢量化操作的原因.它将for您通常在Python中执行的循环推送到C级别,这要快得多.numpy提供矢量化("C级for循环")替代方案,否则需要以元素方式("Python级别for循环")完成.
import numpy as np
from timeit import Timer
li = list(range(500000))
nump_arr = np.array(li)
def python_for():
return [num + 1 for num in li]
def numpy_add():
return nump_arr + 1
print(min(Timer(python_for).repeat(10, 10)))
print(min(Timer(numpy_add).repeat(10, 10)))
# 0.725692612368003
# 0.010465986942008954
Run Code Online (Sandbox Code Playgroud)
该numpy矢量加快X70倍.
Bra*_*mon 11
以下是Wes McKinney 的定义:
数组非常重要,因为它们使您能够在不编写任何for循环的情况下表达对数据的批处理操作.这通常称为矢量化.等大小数组之间的任何算术运算都应用元素运算.
矢量化版本:
>>> import numpy as np
>>> arr = np.array([[1., 2., 3.], [4., 5., 6.]])
>>> arr * arr
array([[ 1., 4., 9.],
[ 16., 25., 36.]])
Run Code Online (Sandbox Code Playgroud)
与原生Python(嵌套)列表上的循环相同:
>>> arr = arr.tolist()
>>> res = [[0., 0., 0.], [0., 0., 0.]]
>>> for idx1, row in enumerate(arr):
for idx2, val2 in enumerate(row):
res[idx1][idx2] = val2 * val2
>>> res
[[1.0, 4.0, 9.0], [16.0, 25.0, 36.0]]
Run Code Online (Sandbox Code Playgroud)
这两个操作如何比较?NumPy版本需要436 ns; Python版本需要3.52μs(3520 ns)."小"时间的这种巨大差异称为微观性能,当您处理大数据或重复操作数千或数百万次时,它变得非常重要.
| 归档时间: |
|
| 查看次数: |
23829 次 |
| 最近记录: |