全部文档
文档中心财务模型deepcubedeepcube语法loc计算多进程并行计算

多进程并行计算

对于计算次数很多,但单次计算数据量又不大的场景,可以使用deepcube的多进程并发计算能力进行性能调优。

并发计算的语法如下:

Copy
from deepcube import pool
from deepcube.cube.cube import deepcube

def main():
	cube1 = deepcube('cube1')
    entity = cube1.Entity
    partner = cube1.Partner
    account = cube1.Account
    value = cube1.Value

    cube1.init_data([account['A1', 'A2', 'B1', 'B2', 'C1', 'C2'],
        entity['E1'].Base(),
        partner['Internal'].Base(), 
        value['Elimination']])
    # 不在with范围内的计算是线性的,不受并发影响
    cube1.loc[account['A1']] = cube1.loc[account['A1']] * 2

    # with内部的所有计算会并发计算,传入cube对象,并且指定并发数size,
    # 如果不指定size,默认使用当前计算机cpu核心数量的一半作为size
    with pool.create(cube1, size=8):
        cube1.loc[account['A']] = cube1.loc[account['A1']] + cube1.loc[account['A2']]
        cube1.loc[account['B']] = cube1.loc[account['B1']] - cube1.loc[account['B2']]
        cube1.loc[account['C']] = cube1.loc[account['C1']] * cube1.loc[account['C2']]

    # 不在with范围内的计算是线性的,不受并发影响
    cube1.loc[account['A2']] = cube1.loc[account['A2']] * 2

    cube1.submit_calc()

用户可以使用with关键字开启多进程,在with的影响范围内,每条计算是并发进行的,因此使用多进程计算是有一个**

非常非常重要的前提条件:并发的各条计算之间没有前后依赖关系!
**

Copy
from deepcube import pool
from deepcube.cube.cube import deepcube

def main():
	cube1 = deepcube('cube1')
    entity = cube1.Entity
    partner = cube1.Partner
    account = cube1.Account
    value = cube1.Value

    cube1.init_data([account['A1', 'A2', 'B1', 'B2', 'C1', 'C2'],
        entity['E1'].Base(),
        partner['Internal'].Base(), 
        value['Elimination']])

    # 以下计算会导致C的值计算错误,因为三条计算是并发的,计算C的时候并没有A和B的计算结果!
    with pool.create(cube1):
        cube1.loc[account['A']] = cube1.loc[account['A1']] + cube1.loc[account['A2']]
        cube1.loc[account['B']] = cube1.loc[account['B1']] - cube1.loc[account['B2']]
        cube1.loc[account['C']] = cube1.loc[account['A']] * cube1.loc[account['B']]


    cube1.submit_calc()

上例中,C的计算依赖A和B的计算结果,因此C的计算不能跟AB计算并行,以下是这个例子的正确写法:

Copy
from deepcube import pool
from deepcube.cube.cube import deepcube

def main():
	cube1 = deepcube('cube1')
    entity = cube1.Entity
    partner = cube1.Partner
    account = cube1.Account
    value = cube1.Value

    cube1.init_data([account['A1', 'A2', 'B1', 'B2', 'C1', 'C2'],
        entity['E1'].Base(),
        partner['Internal'].Base(), 
        value['Elimination']])

    # 以下计算会导致C的值计算错误,因为三条计算是并发的,计算C的时候并没有A和B的计算结果
    with pool.create(cube1):
        cube1.loc[account['A']] = cube1.loc[account['A1']] + cube1.loc[account['A2']]
        cube1.loc[account['B']] = cube1.loc[account['B1']] - cube1.loc[account['B2']]
        
    # 将有依赖的计算放在with影响范围外,前面两个计算仍然并发,但前两个计算完成后才会算C
    cube1.loc[account['C']] = cube1.loc[account['A']] * cube1.loc[account['B']]


    cube1.submit_calc()

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send