我正在使用嵌套数组。我需要对这个数组的每个元素应用一个相当简单但代价高昂的算术运算。
下面是newJsonArr
,其中“第二个街区”是占用大部分时间的房屋(它会运行数千次)。
第一个和第二个块需要分开,因为第一个和第二个块只需处理一次,因为获得MWE
的真实方式非常昂贵时间,明智的。
我不确定如何提高应用于嵌套数组的每个元素的操作的性能。当然a,b,c
会更快地做到这一点,但我对阵列上的广播操作并不熟悉。
numpy
答案 0 :(得分:1)
我使用this question功能在np.outer()找到了答案。
只需要重新排列第一个块,第二个块的运行速度要快许多倍。
# First block. Store a,b,c separately.
a_lst, b_lst, c_lst = [], [], []
for i, p in enumerate(p_lst):
for j, q in enumerate(q_lst):
# a,b,c are obtained via some complicated function of p,q.
# This is just for the purpose of this example.
a_lst.append(1.*p)
b_lst.append(1.*q)
c_lst.append(p+q)
# As arrays.
a_lst, b_lst, c_lst = np.asarray(a_lst), np.asarray(b_lst), np.asarray(c_lst)
# Second block.
# Apply operation on nested list using np.outer.
lst = np.sum(abs(np.outer(a_lst, x) + np.outer(b_lst, y) + np.outer(c_lst, z)), axis=1)
答案 1 :(得分:0)
我不认为有两套循环是必要的。只要崩溃成一个:
## Always pre-allocate with zeros if possible...not just empty lists
lst = np.zeros(M*M)
# First block. This one runs fast.
tik = time.time()
# Fill nested list with values.
for i, p in enumerate(p_lst):
for j, q in enumerate(q_lst):
# a,b,c are obtained via some complicated function of p,q.
# This is just for the purpose of this example.
a, b, c = 1.*p, 1.*q, p+q
# Don't store in nested list, just calculate
##abc_lst[i][j] = [a, b, c]
lst[i*M+j] = (sum(abs(a*x + y*b + c*z)))