对于计算次数很多,但单次计算数据量又不大的场景,可以使用deepcube的多进程并发计算能力进行性能调优。
并发计算的语法如下:
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的影响范围内,每条计算是并发进行的,因此使用多进程计算是有一个**
非常非常重要的前提条件:并发的各条计算之间没有前后依赖关系!**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计算并行,以下是这个例子的正确写法:
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()
回到顶部
咨询热线