Я новичок в python и пытаюсь узнать больше о том, как это работает, последовательно оптимизируя куски наивного кода, которые я уже написал.советы по производительности python - цикл, включающий сравнения
Следующая функция включает цикл, который выполняет операции над элементами списка списка поплавков только тогда, когда значения структуры данных удовлетворяют некоторому условию. Мне было интересно, может ли кто-нибудь прокомментировать (1) способы повышения производительности этого цикла и (2) общие характеристики типа цикла, который я описываю, что делает его более или менее подходящим для разных подходов к его улучшению. Ниже я включил минимальную версию цикла, с которым я работаю.
Некоторые заметки о переменных используется ниже:
#p is a small integer (say, p=10)
#index1 is an integer between 0 and p
#k is an integer between 0 and, say, kmax=100
#mat1 is a list of list of floats whose size is [kmax,p],
# with all values initialized to 0.0.
# mat1 is changed by the loop below
#mat2 is a list of list of floats whose size is [kmax,p]
# with all values initialized to -2e10.
# mat2 is changed by other parts of the program
Кроме того, если это имеет значение, в моем коде все это часть класса, так что есть «я». операторов для переменных. Я прочитал, что локальные переменные лучше обрабатываются функциями python; как это переводится в конструкторы классов?
def greatFunction(index1,k):
index2 = index1
for j in range(p):
if (mat2[k][index2] > -1e10):
mat1[k][j] = mat1[k][j] + mat2[k][index1]*mat2[k][index2]
index2 = index2 - 1
if(index2 < 0):
index2 = index2 + p
Из того, что я читал, я думал, что это будет главным кандидатом на замену списков списков с nparrays (в самом классе, а не превращение вещи в функции) и использование масок, чтобы заботиться о булевом условия. Тем не менее, версия numpy, которую я написал, оказалась медленнее, чем предыдущая версия python. Любая помощь, как ускорение кода, так и важнее, помогает мне понять, почему и как такие циклы могут быть заменены лучшей конструкцией, было бы высоко оценено. Спасибо!
так как '(mat2 [k] [index2]> -1e10)' всегда False, mat1 = 0? –
Извините, я должен был четко указать, что когда я сказал, что «mat2 изменен другими частями программы», эти изменения могут произойти между вызовами функции greatFunction. Таким образом, в общем случае нет (mat2 [k] [index2]> -1e10) не всегда False – David