【发布时间】:2019-04-08 12:09:25
【问题描述】:
我有一个代码,我用一堆数字数据(即多个数组)进行了很多基本的算术计算。我已经意识到,在大多数可以想象的操作中,numpy 类总是比默认的 python 类慢。这是为什么呢?
例如,我有一个简单的 sn-p,我所做的只是用从另一个 numpy 数组中检索到的另一个元素更新 1 个 numpy 数组元素,或者我用另外 2 个 numpy 数组元素的数学乘积更新它。它应该是一个基本操作,但它总是比使用list 慢至少 2-3 倍。
首先我认为这是因为我没有协调数据结构,编译器必须做很多不必要的转换。因此,我重新编码了整个内容,并将每个float 替换为numpy.float64,并将每个list 替换为numpy.ndarray,整个代码中的整个数据都是numpy.float64,因此它不必做任何不必要的事情转换。
代码仍然比我只使用 list 和 float 慢 2-3 倍。
例如:
ALPHA = [[random.uniform(*a_param) for k in range(l2)] for l in range(l1)]
COEFF = [[random.uniform(*c_param) for k in range(l2)] for l in range(l1)]
summa=0.0
for l in range(l1):
for k in range(l2):
summa+=COEFF[l][k] * ALPHA[l][k]
总是比以下速度快 2-3 倍:
ALPHA = numpy.random.uniform(*a_param, (l1,l2))
COEFF = numpy.random.uniform(*c_param, (l1,l2))
summa=0.0
for l in range(l1):
for k in range(l2):
summa+=COEFF[l][k] * ALPHA[l][k]
这怎么可能,我做错了什么,因为 numpy 应该加快速度。
作为记录,我正在使用Python 3.5.3 和numpy (1.12.1),我应该更新吗?
【问题讨论】:
-
没有看到代码来复制您的问题,很难帮助您。向我们展示您认为比给定的纯 Python 等效代码慢的确切代码。
-
请出示您的代码,否则您是在说 “我有这段代码你看不到,你能告诉我为什么它比你看不到的其他代码慢吗? ".
-
好的,我添加了一些用于说明的代码,例如这样的东西,还有我只是用第 4 个数组的 1 个元素更新第 3 个数组的 1 个元素等等的东西。使用 Numpy,每个基本的数组操作都会变慢。
-
使用循环操作 NumPy 数组总是很慢,甚至比使用 Python 列表还要慢。但是,使用 NumPy 执行
summa = (ALPHA * COEFF).sum()应该会更快。在需要对 NumPy 数组使用基于循环的逻辑的情况下,可以考虑使用 Numba 进行快速 JIT 编译代码。 -
COEFF[l][k]不是访问数组元素的惯用方式。[l,k]更好。它对速度没有太大影响,但它表明您只是对 numpy 文档进行了肤浅的阅读。
标签: arrays python-3.x list numpy