我有这个简单的代码,可以在矩阵相乘之后简单地计算出矩阵之和
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 x 32的矩阵,我最好使用第一个版本。但是很快,第二个版本的计算时间增长得比较慢,因此我对第二个版本的感觉更好。现在,当我增加到n_jobs = 2时,我总是比第一个版本慢。这样我就更不容易并行处理for循环了。为什么?我可以尝试编写代码并使用多处理模块,但我假设joblib花了更多的时间和精力,并且实际上是在这样做以并行化for循环。
答案 0 :(得分:0)
在评论中,您指出“我测试过的最大XmlDocument doc = new XmlDocument();
doc.LoadXml("<Fields>" +
"<Field Name='A'>" +
"<DataField>A</DataField>" +
"<Value>'AA'</Value>" +
"</Field>" +
"<Field Name='B'>" +
"<DataField>B</DataField>" +
"<Value>'BB'</Value>" +
"</Field>" +
"</Fields>");
String result = string.empty;
XmlNodeList values = doc.SelectNodes("Fields/Field/Value"); //using Xpath
foreach (XmlNode node in values)
{
result += node.InnerText + "," ;
}
result = result.TrimEnd(',');
是7”。
您在此处使用的数据是 tiny 。即使使用n
,您的矩阵也只有128x128 = 65536个元素。启动一个新的Python进程以并行运行工作的成本非常高;在如此小的尺寸下,只需一个流程即可完成所有工作。
使用更大的矩阵再试一次,例如n=7
。