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_balance 和 sum_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 函数相同,或者驱动模型动态变化是导致减速的 真实 原因?如果是后者,那么您可能需要在别处寻找瓶颈以进行优化。
我有一个有效的微观经济模型 运行 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_balance 和 sum_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 函数相同,或者驱动模型动态变化是导致减速的 真实 原因?如果是后者,那么您可能需要在别处寻找瓶颈以进行优化。