【发布时间】:2017-07-05 04:43:00
【问题描述】:
我有一个包含地球物理数据的大型矩阵(形状:2e6, 6)。在我搜索矩阵中的值以分配我的变量之前,我有 3 个 for 循环。
我的第一个解决方案是使用np.where。实在是太慢了!我阅读了it would be better 以使用另一个for 循环来提高性能。但是,我想出的代码更慢。
请问有人知道如何提高性能吗?
第一个解决方案 (np.where)
for lat in LATS:
for lon in LONS:
for depth in range(1,401,1):
node_point_line = matrix[np.where( (matrix[:,0]==lat) * (matrix[:,1]==lon) * (matrix[:,2]==depth) )][0]
var1 = node_point_line[3]
var2 = node_point_line[4]
var3 = node_point_line[5]
...
第二个解决方案(额外的for 循环)
for lat in LATS:
for lon in LONS:
for depth in range(1,401,1):
matrix_flat = matrix.flatten()
for i in range( len( matrix_flat )):
if matrix_flat[i]==lat and matrix_flat[i+1]==lon and matrix_flat[i+2]==depth:
var1 = matrix_flat[i+3]
var2 = matrix_flat[i+4]
var3 = matrix_flat[i+5]
...
同样,这两种解决方案都太慢了。我避免使用 Fortran 或 C++(我知道它更快)。有什么建议吗?
【问题讨论】:
-
不是
where很慢,而是你做了很多次。您正在迭代 3 个级别。你在用var1,var2,var3做什么? -
我使用这些变量来计算每个 LAT/LON 点的深度积分。
-
@Johngoldenboy 看起来这里有一个XY problem:您在尝试解决更大的问题时要求优化算法的特定部分(查找)。我建议打开一个单独的问题(可能在CS 网站上)要求更快的积分计算算法。我认为你所做的非常不理想,但很难推理,因为我不知道你到底想做什么。
-
在
numpy中,我们尽量避免循环,尤其是多个级别。我们将迭代推送到快速编译的函数上,并且仅在不可能的情况下进行迭代。 -
可能是@numba (numba.pydata.org/numba-doc/0.17.0/user/jit.html) 使用 jit 编译的方法之一。它可以为此类问题提供加速。
标签: python performance numpy matrix