我有一个由递归函数组成的确定性动态编程算法,当我增加数据点(下面代码中的 x 和 s)时,我的代码需要永远(超过 5 个小时)才能给我一个输出。
我听说有一种叫做并行计算的东西multiprocessing
在 python 中使用模块,但我不确定这是否能解决我的问题,如果是的话,我根本不知道。
import time
start_time = time.time()
from openpyxl import load_workbook
import pandas as pd
import numbers
wb=load_workbook(filename="data.xlsx", data_only=True)
ws=wb['Sheet1']
#for 1000 step size
x=806
s=1001
n=24
P=[0 for k in range(n)]
for k in range(n):
P[k]=ws.cell(row=k+2, column=2).value
X=[0 for j in range(x)]
for j in range(x):
X[j]=ws.cell(row=j+2, column=3).value
S=[0 for i in range(s)]
for i in range(s):
S[i]=ws.cell(row=i+2, column=4).value
Sin=100
Sout=100
F=[[0 for j in range(x)] for i in range(s)]
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ n=23 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
class c:
def abc1(self):
self.df_output1 = pd.DataFrame()
for count, k in enumerate(range(n)):
for i in range(s):
for j in range(x):
if k==n-1:
if (S[i]+X[j])==Sin:
F[i][j]=-X[j]*P[k]
else:
F[i][j]="NA"
self.Fbar=list()
self.Xbar=list()
for f in F:
try:
FFF=max([x for x in f if isinstance(x, numbers.Number)])
XXX=X[f.index(max([x for x in f if isinstance(x, numbers.Number)]))]
self.Fbar.append(FFF)
self.Xbar.append(XXX)
except ValueError:
FFF="NA"
self.Fbar.append(FFF)
self.Xbar.append(FFF)
self.df_output1["n="+str(k).format(k)] = self.Xbar
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 22>=n>=1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
def abc2(self):
list2=(list(range(n))[::-1][1:n-1])
self.df_output2 = pd.DataFrame()
for count, k in enumerate(list2):
for i in range(s):
for j in range(x):
try:
if max(S)>=(S[i]+X[j])>=min(S):
FFFFF=S[i]+X[j]
F[i][j]=-X[j]*P[k]+dict(zip(S,self.Fbar))[FFFFF]
if max(S)<(S[i]+X[j])<min(S):
F[i][j]="NA"
except TypeError:
F[i][j]="NA"
self.Fbar=list()
self.Xbar=list()
for f in F:
try:
FFF=max([x for x in f if isinstance(x, numbers.Number)])
XXX=X[f.index(max([x for x in f if isinstance(x, numbers.Number)]))]
self.Fbar.append(FFF)
self.Xbar.append(XXX)
except ValueError:
FFF="NA"
self.Fbar.append(FFF)
self.Xbar.append(FFF)
self.df_output2["n="+str(k).format(k)] = self.Xbar
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ n=0 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
def abc3(self):
self.df_output3 = pd.DataFrame()
for count, k in enumerate(range(n)):
if k==0:
for i in range(s):
for j in range(x):
if S[i]==Sin and max(S)>=(S[i]+X[j])>=min(S):
FFFFF=(S[i]+X[j])
F[i][j]=-X[j]*P[k]+dict(zip(S,self.Fbar))[FFFFF]
else:
F[i][j]="NA"
self.Fbar=list()
self.Xbar=list()
for f in F:
try:
FFF=max([x for x in f if isinstance(x, numbers.Number)])
XXX=X[f.index(max([x for x in f if isinstance(x, numbers.Number)]))]
self.Fbar.append(FFF)
self.Xbar.append(XXX)
except ValueError:
FFF="NA"
self.Fbar.append(FFF)
self.Xbar.append(FFF)
self.df_output3["n="+str(k).format(k)] = self.Xbar
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
def abc4(self):
writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')
self.df_output1.to_excel(writer, sheet_name='Sheet1', startcol=0, header=True, index=False)
self.df_output2.to_excel(writer, sheet_name='Sheet1', startcol=1, header=True, index=False)
self.df_output3.to_excel(writer, sheet_name='Sheet1', startcol=n-1, header=True, index=False)
writer.save()
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
def abc5(self):
wb=load_workbook(filename="output.xlsx", data_only=True)
ws=wb['Sheet1']
X=[[0 for i in range(s)] for k in range(n)]
Xlist=list()
Slist=list()
Plist=list()
for k in range(n):
for i in range(s):
X[k][i]=ws.cell(column=24-k, row=i+2).value
if k==0:
Xstar=max([x for x in X[k] if isinstance(x, numbers.Number)])
Sstar=Sin+Xstar
Gain=-Xstar*P[k]
Xlist.append(Xstar)
Slist.append(Sstar)
Plist.append(Gain)
else:
Xstar=X[k][S.index(Sstar)]
Sstar=Sstar+Xstar
Gain=-Xstar*P[k]
Xlist.append(Xstar)
Slist.append(Sstar)
Plist.append(Gain)
print("Profit:",sum(Plist))
foo=c()
foo.abc1()
foo.abc2()
foo.abc3()
foo.abc4()
foo.abc5()
print("--- %s seconds ---" % (time.time() - start_time))
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
如果有人可以帮助我了解如何multiprocessing
在 python 中使用模块或任何其他方式来减少处理时间,那就太好了。蒂亚:)