Я использую модуль scipy.optimize
для подгонки параметров к измерениям. Функции требуют много переменных, которые я определил в основном пространстве имен. Хотя все функции находятся в одном файле, я все равно получаю NameError
.
Ошибка появляется только при использовании функции параллельной обработки с использованием аргумента workers
для differential_evolution
.
Ошибка исчезает, если я не использую функцию workers
. Если я явно передаю переменные в функции, они также исчезают.
Следующий код генерирует ошибку NameE:
import scipy.optimize
def optimize_parameters():
solution = scipy.optimize.differential_evolution(error, bounds=[[0, 1], [0, 1], [0, 1], [0, 1]], workers=4)
print(solution.x)
def error(x):
parameter_dict.update(zip(parameter_list, x))
return complex_error_calculation()
def complex_error_calculation():
return parameter_dict['a'] * 10 + parameter_dict['b'] * 5 - parameter_dict['c'] * 2 + parameter_dict['d']
if __name__ == "__main__":
parameter_list = ['a', 'b', 'c', 'd']
parameter_dict = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
optimize_parameters()
Выход:
NameError: name 'parameter_dict' is not defined
Если я внесу изменения в вызовы функций, код будет работать, как и ожидалось
import scipy.optimize
def optimize_parameters():
solution = scipy.optimize.differential_evolution(error, bounds=[[0, 1], [0, 1], [0, 1], [0, 1]],
args=[parameter_dict, parameter_list])
print(solution.x)
def error(x, parameter_dict, parameter_list):
parameter_dict.update(zip(parameter_list, x))
return complex_error_calculation(parameter_dict)
def complex_error_calculation(parameter_dict):
return parameter_dict['a'] * 10 + parameter_dict['b'] * 5 - parameter_dict['c'] * 2 + parameter_dict['d']
if __name__ == "__main__":
parameter_list = ['a', 'b', 'c', 'd']
parameter_dict = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
optimize_parameters()
Я бы хотел, чтобы код выполнялся параллельно, и есть обходной путь, чтобы код работал параллельно. Это как запутанное решение. Я хотел бы понять, почему я получаю NameError, я использую рабочую функцию и питонский способ решения этой проблемы.