Cobb Douglas函数极大地降低了跑步速度.如何在Python中加速非线性计算



我有一个运行10个模块的微观经济模型,2000个代理,运行时间长达10年。该程序运行速度很快,在几秒钟内就可以提供结果、输出和图形。

然而,当我实现非线性Cobb Douglas生产函数来更新公司的生产量时,根据参数的不同,该程序在3分钟内产生结果的速度变慢了。

有人知道我如何加快计算并快速得出结果吗?

以下是函数的代码:α=0.5

def update_product_quantity(self):
    if len(self.employees) > 0 and self.total_balance > 0:
        dummy_quantity = self.total_balance ** parameters.ALPHA * 
                         self.get_sum_qualification() ** (1 - parameters.ALPHA)
        for key in self.inventory.keys():
            while dummy_quantity > 0:
                self.inventory[key].quantity += 1
                dummy_quantity -= 1

以前工作得很快的线性函数是:

def update_product_quantity(self):
    if len(self.employees) > 0:
        dummy_quantity = self.get_sum_qualification()
        for key in self.inventory.keys():   
            while dummy_quantity > 0:
                self.inventory[key].quantity += 1
                dummy_quantity -= 1

如果不在代码的其余部分看到上下文,很难说如何修复它;但有一件事可能会加快速度,那就是用numpy预先计算伪量。例如,您可以为每个代理的total_balancesum_qualification创建一个numpy数组,计算相应的dummy_quantities数组,然后将其分配回代理。

下面是一个高度简化的加速演示:

%%timeit
vals = range(100000)
new_vals = [v**0.5 for v in vals]
> 100 loops, best of 3: 15 ms per loop

现在,使用numpy:

%%timeit
vals = np.array(range(100000))
new_vals = np.sqrt(vals)
> 100 loops, best of 3: 6.3 ms per loop

然而,从几秒钟到3分钟的减速对于计算的差异来说似乎是极端的。模型的行为方式与C-D函数相同吗?还是驱动模型动力学的变化是减速的真正原因?如果是后者,那么您可能需要在其他地方查找瓶颈以进行优化。

最新更新