我有一個類似的代碼:
s = some_template
s = s.replace('<HOLDER1>',data1)
s = s.replace('<HOLDER2>',data2)
s = s.replace('<HOLDER3>',data3)
... #(about 30 similar lines)
其中 data1/data2/etc 通常是對可能需要一段時間來計算的函式或復雜運算式的呼叫。例如:
s = some_template
s = s.replace('<HOLDER4>',long_func4(a,b,'some_flag') if c==1 else '')
s = s.replace('<HOLDER5>',long_func5(d,e).replace('.',''))
s = s.replace('<HOLDER6>',self.attr6)
s = s.replace('<HOLDER7>',f'{self.name}_{get_cur_month()}')
... #(about 30 similar lines)
為了節省運行時間,我希望 string.replace() 方法僅在 str 中找到舊值時才計算新值。這可以通過以下方式實作:
if '<HOLDER1>' in s:
s = s.replace('<HOLDER1>',data1)
if '<HOLDER2>' in s:
s = s.replace('<HOLDER2>',data2)
if '<HOLDER3>' in s:
s = s.replace('<HOLDER3>',data3)
...
但我不喜歡這種解決方案,因為它需要雙倍的代碼行數,這將非常混亂,并且每個持有者也會在 s 中找到舊值兩次..
有任何想法嗎?
謝謝!
uj5u.com熱心網友回復:
str是不可變的。你不能改變它,只允許創建一個新實體。
您可以執行以下操作:
def replace_many(replacements, s):
for pattern, replacement in replacements:
s = s.replace(pattern, replacement)
return s
without_replacements = 'this_will_be_replaced, will it?'
replacements = [('this_will_be_replaced', 'by_this')]
with_replacements = replace_many(replacements, without_replacements)
你可以很容易地讓它變得懶惰:
def replace_many_lazy(replacements, s):
for pattern, replacement_func in replacements:
if pattern in s:
s = s.replace(pattern, replacement_func())
return s
without_replacements = 'this_will_be_replaced, will it?'
replacements = [('this_will_be_replaced', lambda: 'by_this')]
with_replacements = replace_many_lazy(replacements, without_replacements)
...現在除非必要,否則您不會進行昂貴的計算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492595.html
