Даже после твоего редактирования и серии комментариев с детства я до сих пор не совсем понял.В первом предложении вы говорите, что первый вызов функции f () должен вызывать g (), но впоследствии возвращает кешированные значения.Но затем в своих комментариях вы говорите: «g () не не вызывается, несмотря ни на что» (выделено мое).Я не уверен, что вы отрицаете: Вы говорите, что g () должен никогда не вызываться (не имеет особого смысла; почему g () существует?);или что g () может быть вызвано , но не может (ну, это все равно противоречит тому, что g () вызывается при первом вызове f ()).Затем вы даете фрагмент, который вообще не включает g () и действительно не относится ни к первому предложению вашего вопроса, ни к цепочке комментариев с умением.
В случае, если вы приступите к редактированиюснова, вот фрагмент, на который я отвечаю:
У меня есть:
a = f(Z)
if x:
return 5
elif y:
return a
elif z:
return h(a)
Код работает, но я хочу реструктурировать его так, чтобы f (Z) быловызывается только если используется значение.Я не хочу менять определение f (...), и Z немного велика для кеширования.
Если это действительно ваш вопрос, то ответ просто
if x:
return 5
elif y:
return f(Z)
elif z:
return h(f(Z))
Именно так можно добиться, чтобы «f (Z) вызывалось только в том случае, если используется значение».
Я не совсем понимаю, «Z немного велика для кеширования».Если вы имеете в виду, что в ходе выполнения программы будет слишком много разных значений Z, что запоминание бесполезно, то, возможно, вам придется прибегнуть к предварительному расчету всех значений f (Z) и просто посмотреть их во время выполнения.Если вы не можете сделать это (потому что вы не можете знать значения Z, с которыми столкнется ваша программа), тогда вы вернетесь к запоминанию.Если это все еще слишком медленно, то ваш единственный реальный вариант - использовать что-то быстрее, чем Python (попробуйте модуль Psyco, Cython, ShedSkin или C-код, написанный вручную).