什么是矢量化?[关闭]
- 2025-02-25 09:07:00
- admin 原创
- 18
问题描述:
在 Python 中矢量化 for 循环是什么意思?还有其他方法可以编写嵌套 for 循环吗?
我是 Python 新手,在研究中,我总是遇到 NumPy 库。
解决方案 1:
Pythonfor
循环本质上比 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
矢量化加法numpy
速度提高了 70 倍。
解决方案 2:
以下是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.]])
与原生 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]]
这两个操作如何比较?NumPy 版本需要 436 纳秒;Python 版本需要 3.52 微秒(3520 纳秒)。这种“微小”时间的巨大差异被称为微性能,当您处理较大的数据或重复操作数千次或数百万次时,它就变得很重要。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD