我有这个简单的代码,只需在一些矩阵乘法后计算矩阵之和
def serial_decohere(K, rho, n):
"""
:param K: List of bumpy matrices of size 2^n by 2^n
:param rho: A matrix of size 2^n by 2^n
:param n: Integer
:return: A matrix of size 2^n by 2^n
"""
out = np.zeros((pow(2, n), pow(2, n)), dtype=complex)
for i in range(len(K)):
out += np.dot(K[i], np.dot(rho, op.ctranspose(K[i])))
return out
总和中的项数随着变量n呈指数增长。更具体地,列表K的长度增长为3 ^ n。所以我决定将它并行化。使用joblib我带来了这个
def decohere(K, rho, n):
"""
:param K: List of matrices of size 2^n by 2^n
:param rho: A matrix of size 2^n by 2^n
:param n: A positive integer
:return: A matrix of size 2^n by 2^n
"""
out = np.zeros((pow(2, n), pow(2, n)), dtype=complex)
def apply_kraus_op(kraus, rho_s):
"""
:param rho_s : Density matrix of system rho_s
:return: returns the density matrix
"""
nonlocal out
out += np.dot(kraus, np.dot(rho_s, op.ctranspose(kraus)))
Parallel(n_jobs=2)((delayed(apply_kraus_op))(K[i], rho) for i in range(len(K)))
return out
然后决定测试它。对于n_jobs = 1,对于大小小于32乘32的矩阵,我对第一个版本更好。但很快,第二个版本的计算时间增长得更慢,所以我最好用第二个版本。现在,当我增加到n_jobs = 2时,我总是比第一个版本慢。所以我更糟糕的是并行化for循环。为什么?我可以尝试编写代码并使用多处理模块,但我假设joblib需要更多的思考和时间,并且基本上是这样做以并行化for循环。
在评论中,你注意到“我测试过的最大的n
是7”。
您在这里使用的数据很小。即使使用n=7
,您的矩阵也只有128x128 = 65536个元素。启动新的Python进程以并行运行工作的成本非常高;如此小的尺寸,在一个过程中完成所有工作的速度更快。
再试一次更大的矩阵...比如,n=12
。