我有数百个数组,我希望每个数组都获得它们的 IRR。下面是我的测试示例代码:
#!/bin/python3
#encoding:utf-8
import numpy as np, numpy_financial as npf
import sys, time
import multiprocessing as mp
# gen_cf just simply generate a cashflow
def gen_cf(n, m, disc_r=0.7, scales=100.0):
cf= np.random.rand(n,m)*scales
o = np.array( [1.0]*(m-1) )
cf[:,0] = -disc_r * cf[:,1:].dot( o.transpose() )
return cf
if __name__=='__main__':
if len(sys.argv)>=4:
n = int(sys.argv[1]) # numbers of cashflows
m = int(sys.argv[2]) # array size, actually means, 111 years x 12 months cashflow
c = max(0,int(sys.argv[3])) # number of core, if c==0, means not using multiprocessing
if len(sys.argv)>=5:
r = float(sys.argv[4])
else:
r = 0.3
cf = gen_cf(n,m, r)
t1 = time.time()
if c==0:
irr_res=list()
for j in cf:
irr_res.append(npf.irr(j))
irr_res = (np.array(irr_res)+1)**12 -1 # converting a monthly interest rate to yearly rate
else:
pool = mp.Pool( c )
res = pool.map_async( npf.irr, cf )
pool.close()
pool.join()
irr_res = (np.array(res.get())+1)**12 -1 # converting a monthly interest rate to yearly rate
t2 = time.time()
print('(c,grps,m,sec)',c,',',n,',',m,',',t2-t1)
一开始,我希望多处理可以帮助我减少运行时间,但是,下面是一些场景的结果:
请注意,(c,grps,m,sec)表示(核心数,要计算 IRR 的数组数,每月现金流数,运行时间(秒))
(c,grps,m,sec) 0 , 8 , 1332 , 39.143982887268066
(c,grps,m,sec) 1 , 8 , 1332 , 35.130868673324585
(c,grps,m,sec) 2 , 8 , 1332 , 36.408902406692505
(c,grps,m,sec) 3 , 8 , 1332 , 36.20160460472107
(c,grps,m,sec) 4 , 8 , 1332 , 36.96308135986328
(c,grps,m,sec) 6 , 8 , 1332 , 36.3944730758667
(c,grps,m,sec) 8 , 8 , 1332 , 37.501017808914185
(c,grps,m,sec) 0 , 16 , 1332 , 79.13998365402222
(c,grps,m,sec) 1 , 16 , 1332 , 79.82945895195007
(c,grps,m,sec) 2 , 16 , 1332 , 77.65851593017578
(c,grps,m,sec) 3 , 16 , 1332 , 72.23901343345642
(c,grps,m,sec) 4 , 16 , 1332 , 73.81513595581055
(c,grps,m,sec) 6 , 16 , 1332 , 74.56148982048035
(c,grps,m,sec) 8 , 16 , 1332 , 70.7759792804718
(c,grps,m,sec) 0 , 24 , 1332 , 119.95271706581116
(c,grps,m,sec) 1 , 24 , 1332 , 114.32123017311096
(c,grps,m,sec) 2 , 24 , 1332 , 104.77917790412903
(c,grps,m,sec) 3 , 24 , 1332 , 110.81930780410767
(c,grps,m,sec) 4 , 24 , 1332 , 109.10184526443481
(c,grps,m,sec) 6 , 24 , 1332 , 112.1197099685669
(c,grps,m,sec) 8 , 24 , 1332 , 107.15462231636047
(c,grps,m,sec) 0 , 48 , 1332 , 241.9021770954132
(c,grps,m,sec) 1 , 48 , 1332 , 235.01355290412903
(c,grps,m,sec) 2 , 48 , 1332 , 224.38720631599426
(c,grps,m,sec) 3 , 48 , 1332 , 217.50936579704285
(c,grps,m,sec) 4 , 48 , 1332 , 217.74877333641052
(c,grps,m,sec) 6 , 48 , 1332 , 215.21786379814148
(c,grps,m,sec) 8 , 48 , 1332 , 218.60614490509033
根据结果,我发现,
1. 是否使用多处理并没有显着节省时间
在 c=0 的情况下,与 c>0 的情况没有太大区别,例如 [(c,grps,m,sec) 0 , 8 , 1332 , 39.143982887268066] vs [(c,grps,m,sec) 8 , 8 , 1332 , 37.501017808914185] 或 [(c,grps,m,sec) 0 , 48 , 1332 , 241.9021770954132] vs [(c,grps,m,sec) 8 , 48 , 1332 , 218.6061449050903]
2. 当内核数量变化时,运行时与内核的比例并不完全一致
在 grps=48 的情况下:运行时间在 215 秒到 235 秒之间变化,我不能指望 8 核运行时间(218.6 秒)是 4 核运行时间(217.7 秒)的一半
所以,我的问题是: 为什么多处理或多核无助于减少 IRR 运行时间? 它没有意义吗?
或者,我在某个地方错了吗?
system info:
ubuntu 20.10
i5-9300H×8
24GB RAM