Я пытаюсь использовать SciPy Weave для ускорения задачи с интенсивным циклом в коде Python, который я перевожу из MatLab. В MatLab я пошел на все, чтобы векторизовать его, чтобы он работал очень быстро. Я уже пробовал это в Python с циклами, и это недопустимо медленно, поэтому, хотя я, вероятно, мог бы сделать то же, что и в MatLab с NumPy, и запустить его так же быстро, я хочу научиться использовать Weave, потому что это будет действительно полезно в будущее. Я проверил мои C ++ работы здесь: http://ideone.com/E8ACaq (переменные над первым комментарием — те, которые я передаю в weave), и у меня есть более простые примеры, работающие в weave, но я не могу получить реальный код для игры в мяч в weave!
Что мне нужно знать, так это то, в каком формате должны быть переменные, чтобы их можно было вводить и выводить. В идеале я хочу получить массив NumPy и передать множество целых чисел, NUMPY массивов и двойных чисел, как показано ниже (отступы Python не показаны из-за того, как здесь работает код).
def GoodManLookup(CycleData,MaterialID,Materials):
nCyc=len(CycleData)
NRVals=int(Materials[MaterialID]['rvalues'])
NLevels=np.product(Materials[MaterialID]['levels'].shape)
GoodmanAmp=Materials[MaterialID]['data'][:,1]
GoodmanMean=Materials[MaterialID]['data'][:,0]
RValAngles=np.array([np.arctan2(GoodmanData[0:NRVals,1],GoodmanData[0:NRVals,0])*180/math.pi])
CycleAngles=np.arctan2(CycleData[:,0],CycleData[:,1])*180/math.pi
CycleAngles[CycleAngles==180]=179.99
CycleAngles[CycleAngles==90]=89.99
CycleAngles[CycleAngles==0]=0.01
#Get sector of each cycle
SectB=np.tile(RValAngles[0,0:NRVals-1],(nCyc,1))
SectT=np.tile(RValAngles[0,1:NRVals],(nCyc,1))
Angles=np.tile(np.array([CycleAngles]).swapaxes(1,0),(1,NRVals-1))
Sect=np.array([np.sum(np.bitwise_and(Angles>SectB,Angles<SectT)*np.tile(np.array([range(0,NRVals-1)]),(nCyc,1)),axis=1)]).swapaxes(1,0)
Amplitude=CycleData[:,0];
Mean=CycleData[:,1];
N=Materials[MaterialID]['levels'];
if CurveFit==1:
PowerLaw=True
elif CurveFit==0:
PowerLaw=False
code_cpp ="""//code on IDE one
"""
P = weave.inline(code_cpp,['Sect','Amplitude','Mean','nCyc','NLevels','PowerLaw','N','NRVals','GoodmanMean','GoodmanAmp'],compiler='gcc')
Я новичок в Python и C ++, так что это то, что вы могли бы назвать идеальным штормом некомпетентности!
Задача ещё не решена.
Других решений пока нет …