为什么不能通过更多的流程获得并行化收益?

时间:2018-09-03 18:06:19

标签: python parallel-processing joblib

我有这个简单的代码,可以在矩阵相乘之后简单地计算出矩阵之和

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循环。

1 个答案:

答案 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