我有一个f(a,b,c,d)
具有以下置换对称性的标量函数
f(a,b,c,d) = f(c,d,a,b) = -f(b,a,d,c) = -f(d,c,b,a)
我正在使用它来完全填充 4D 数组。以下代码(使用 python/NumPy)有效:
A = np.zeros((N,N,N,N))
for a in range(N):
for b in range(N):
for c in range(N):
for d in range(N):
A[a,b,c,d] = f(a,b,c,d)
但显然我想利用对称性来减少这部分代码的执行时间。我试过了:
A = np.zeros((N,N,N,N))
ab = 0
for a in range(N):
for b in range(N):
ab += 1
cd = 0
for c in range(N):
for d in range(N):
cd += 1
if ab >= cd:
A[a,b,c,d] = A[c,d,a,b] = f(a,b,c,d)
这将执行时间减少了一半。但是对于我尝试的最后一个对称性:
A = np.zeros((N,N,N,N))
ab = 0
for a in range(N):
for b in range(N):
ab += 1
cd = 0
for c in range(N):
for d in range(N):
cd += 1
if ab >= cd:
if ((a >= b) or (c >= d)):
A[a,b,c,d] = A[c,d,a,b] = f(a,b,c,d)
A[b,a,d,c] = A[d,c,b,a] = -A[a,b,c,d]
哪个有效,但不会让我接近另一个两倍加速的因素。我不认为这是正确的原因,但不明白为什么。
我怎样才能在这里更好地利用这种特殊的置换对称性?