У меня есть что-то похожее на следующий код, и я хотел бы знать, видите ли вы место для оптимизации:
def __call__( self, t, x ):
input_activities = x[ :self.input_size ]
for j in range( self.output_size ):
for i in range( self.input_size ):
# did the input neuron j spike in this timestep?
spiked = True if np.rint( input_activities[ i ] ) else False
if spiked:
# update memristor resistance state
self.memristors[ j, i ].pulse( t, local_error[ j ] )
# query each memristor for its resistance state
extract_R = lambda x: x.get_state( t, value="conductance", scaled=True )
extract_R_V = np.vectorize( extract_R )
weights = extract_R_V( self.memristors )
# calculate the output at this timestep
return_value = np.dot( weights, input_activities )
return return_value
def pulse( self, t, V=0.1 ):
c = self.a + self.b * V
self.r_curr = self.r_min + self.r_max * (((self.r_curr - self.r_min) / self.r_max)**(1 / c) + 1)**c
return self.r_curr
Вызов .pulse
обновляет переменную объекта мемристора self.r_curr
, которая затем возвращается get_state()
метод.
Я почти уверен, что этот код можно оптимизировать, но я бы не знал, каким будет лучший способ сделать это. Могу ли я вернуть обновленные значения из pulse()
напрямую во временный массив NumPy в __call__
?
Текущая производительность моего кода, оцененная в PyCharm, следующая: количество вызовов и время в мс график вызовов