gpt4 book ai didi

python - 提高优化问题的速度

转载 作者:行者123 更新时间:2023-12-01 06:10:14 25 4
gpt4 key购买 nike

我有以下应用程序可以优化以下 pb。该代码可以工作,但我发现它有点慢。有什么想法可以提高性能(无需编写 C 代码)以更好地使用 python、numpy 和 scipy?我认为插值函数是主要耗时的部分。

from scipy.optimize import leastsq
from scipy.interpolate import interp1d
import timeit


class Bond(object):
def __init__(self, years, cpn):
self.years = years
self.coupon = cpn
self.cashflows = [(0.0, -1.0)]
self.cashflows.extend([(float(i),self.coupon) for i in range(1,self.years)])
self.cashflows.append((float(self.years), 1.0 + self.coupon))

def pv(self, market):
return sum([cf[1] * market.df(cf[0]) for cf in self.cashflows])

class Market(object):
def __init__(self, instruments):
self.instruments = sorted(
instruments, key=lambda instrument : instrument.cashflows[-1][0])
self.knots = [0.0]
self.knots.extend([inst.cashflows[-1][0] for inst in self.instruments])
self.dfs = [1.0]
self.dfs.extend([1.0] * len(self.instruments))
self.interp = interp1d(self.knots, self.dfs)

def df(self, day):
return self.interp(day)

def calibrate(self):
leastsq(self.__target, self.dfs[1:])

def __target(self, x):
self.dfs[1:] = x
self.interp = interp1d(self.knots, self.dfs)
return [bond.pv(self) for bond in self.instruments]


def main():
instruments = [Bond(i, 0.02) for i in xrange(1, numberOfInstruments + 1)]
market = Market(instruments)
market.calibrate()
print('CALIBRATED')

numberOfTimes = 10
numberOfInstruments = 50
print('%.2f' % float(timeit.timeit(main, number=numberOfTimes)/numberOfTimes))

最佳答案

您应该尝试对求和以及对插值例程的调用进行矢量化。例如,像这样:

import numpy as np

class Bond(object):
def __init__(self, years, cpn):
self.years = years
self.coupon = cpn

self.cashflows = np.zeros((self.years + 1, 2))
self.cashflows[:,0] = np.arange(self.years + 1)
self.cashflows[:,1] = self.coupon
self.cashflows[0,:] = 0, -1
self.cashflows[-1,:] = self.years, 1.0 + self.coupon

def pv(self, market):
return (self.cashflows[:,1] * market.df(self.cashflows[:,0])).sum()

这似乎可以提供约 10 倍的加速。您还可以以类似的方式将 Market 中的 knotsdfs 列表替换为数组。

重新校准需要时间的原因是 leastsq 必须再次验证它是否确实处于局部最小值。这需要对目标函数进行数值微分,这确实需要时间,因为您有许多自由变量。优化问题相当简单,因此只需几步即可收敛,这意味着验证最小值所花费的时间几乎与解决问题一样多。

关于python - 提高优化问题的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com