0

我有数百个数组,我希望每个数组都获得它们的 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
4

0 回答 0