Сценарий
Пусть test
будет модулем, который мы запускаем как __main__
. Этот модуль содержит одну глобальную переменную с именем primes
, которая инициализируется в модуле следующим назначением.
primes = []
Модуль также содержит функцию с именем pi
, которая изменяет эту глобальную переменную:
def pi(n):
global primes
"""Some code that modifies the global 'primes' variable"""
Затем я хочу синхронизировать указанную функцию с помощью встроенного модуля timeit
. Я хочу использовать функцию timeit.repeat
и получить минимальное значение времени как способ повышения точности измерения (вместо измерения только один раз, которое может быть замедлено из-за несвязанных процессов).
print(min(timeit.repeat('test.pi(50000)',
setup="import test",
number=1, repeat=10)) * 1000)
Проблема в том, что функция pi
ведет себя по-разному в зависимости от значения primes
: я ожидал, что для каждого повторения оператор import test
в параметре setup
будет перезапускать primes = []
оператор в test
, таким образом «сбрасывая» primes
, чтобы выполняемый код был идентичен для каждого повторения. Но вместо этого используется значение primes
, полученное в результате предыдущего выполнения, поэтому мне пришлось добавить оператор test.primes = []
в параметр setup
:
print(min(timeit.repeat('test.pi(50000)',
setup="import test \n" + "test.primes = []",
number=1, repeat=10)) * 1000)
Вопрос
Это подводит меня к вопросу: существует ли прямой способ (т. Е. В одном выражении) «сбросить» значения всех глобальных переменных на те, которые были, когда они были впервые назначены в модуле
В этом конкретном сценарии добавление одного оператора для «сброса» вручную primes
работает нормально, но рассмотрим случай, в котором есть много глобальных переменных, и вы хотите «сбросить» их все.
Боковой квест-ион
Почему оператор import test
не выполняет повторное начальное primes = []
присваивание?