Cobb-Douglas 函数极大地减慢了 运行。如何加快 Python 中的非线性计算?

Cobb-Douglas functions slows running tremendously. How to expedite a non-linear calculation in 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 函数相同,或者驱动模型动态变化是导致减速的 真实 原因?如果是后者,那么您可能需要在别处寻找瓶颈以进行优化。