我正在爲Python 3編寫一個memoizing裝飾器。計劃是在一個臨時文件中醃製緩存以節省多次執行的時間。我應該將臨時文件存儲在__pycache__文件夾中嗎?
如果包含裝飾函數的文件已被更改,緩存將被刪除,就像__pycache__中的.pyc文件一樣。於是我開始考慮通過將pickle緩存放入__pycache__來清理用戶的項目目錄。在這個目錄中存儲文件是否有副作用?它是誤導還是令人困惑?
我正在爲Python 3編寫一個memoizing裝飾器。計劃是在一個臨時文件中醃製緩存以節省多次執行的時間。我應該將臨時文件存儲在__pycache__文件夾中嗎?
如果包含裝飾函數的文件已被更改,緩存將被刪除,就像__pycache__中的.pyc文件一樣。於是我開始考慮通過將pickle緩存放入__pycache__來清理用戶的項目目錄。在這個目錄中存儲文件是否有副作用?它是誤導還是令人困惑?
您應該...
__memo__
或其他東西:這將允許您緩存多個執行。但是,您將「污染」應用程序的文件結構。原因,你應該從未亂用__pycache__
:
__pycache__
是CPython的特異性。雖然它最有可能是您現在使用的實現,但假設每個人都沒有任何理由,它不是可移植/安全/良好的做法。__pycache__
是作爲一個透明的優化,也就是說,沒有人應該在乎它是否存在。這是CPython人員的設計決定,所以你不應該繞過它。python3 -B myapp.py
,則不會創建__pycache__
(如果它不存在),否則將被忽略。__pycache__
,原因有幾個。至少,我這樣做。__pycache__
因爲「它不污染應用程序的文件結構」是一個錯覺。該目錄完全可以被視爲「污染」。如果Python解釋器已經污染了東西,爲什麼不能用__memo__
呢?啊,我認爲一個額外的文件夾是要走的路,你在做出好的點。但請記住,如果它不存在,我們可以創建一個pycache文件夾。所以我認爲這不是一個可移植性問題,而是一個潛在的混亂原因:「我用-B運行了我的腳本,爲什麼現在有一個pycache文件夾?!」或「爲什麼我的功能沒有記憶?我所做的只是刪除pycache文件夾......」 –
嗯,這些觀點並不能說服我。他們中的大多數實際上是將記憶存儲在相同目錄中的參數。也許可以檢測-B開關,然後開始記憶。我們可以將memoization看作優化的一種形式,所以如果用戶刪除'__pycache__',也許可以重新啓動memoization。 – Mitar
我不明白你的memoizing裝飾者實際上做了什麼。你能解釋一下嗎? – 3442
當然!裝飾器改變函數的行爲,以便參數及其結果存儲在字典(緩存)中。當函數被調用時,它檢查函數是否已經被這些參數評估過。如果是這樣,函數查找並返回字典中的結果,而不是重新計算。 –
哦,好主意!儘管如此,它要求函數是純粹的。但是,'__pycache__'與那個有什麼關係呢? **編輯**:現在我明白了;寫一個答案。 – 3442