【发布时间】:2022-01-12 06:04:33
【问题描述】:
-
为什么在这种情况下 Numpy 比列表推导慢?
-
矢量化此网格结构的最佳方法是什么?
In [1]: import numpy as np
In [2]: mesh = np.linspace(-1, 1, 3000)
In [3]: rowwise, colwise = np.meshgrid(mesh, mesh)
In [4]: f = lambda x, y: np.where(x > y, x**2, x**3)
# Using 2D arrays:
In [5]: %timeit f(colwise, rowwise)
285 ms ± 2.25 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# Using 1D array and list-comprehension:
In [6]: %timeit np.array([f(x, mesh) for x in mesh])
58 ms ± 2.69 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# Equivalent result
In [7]: np.allclose(f(colwise, rowwise), np.array([f(x, mesh) for x in mesh]))
True
【问题讨论】:
-
您在这两种情况下都使用
where。但是对于 [5],所有三个参数都是 (3000,3000) 形的。在 [6] 中,虽然f被调用了 3000 次,但x参数是一个标量。使用f(mesh,x)会减慢它的速度。另一方面,在meshgrid中使用sparse=True会加快[5],因为xarg 仅为(3000,)。 -
where是一个函数。它的参数在传递给它之前会被完整评估。 where` 然后返回一个与三个数组的broadcasted并集兼容的新数组。不要将其视为迭代器。
标签: python arrays numpy performance