2016-04-03 72 views
2

我正在爲Python 3編寫一個memoizing裝飾器。計劃是在一個臨時文件中醃製緩存以節省多次執行的時間。我應該將臨時文件存儲在__pycache__文件夾中嗎?

如果包含裝飾函數的文件已被更改,緩存將被刪除,就像__pycache__中的.pyc文件一樣。於是我開始考慮通過將pickle緩存放入__pycache__來清理用戶的項目目錄。在這個目錄中存儲文件是否有副作用?它是誤導還是令人困惑?

+0

我不明白你的memoizing裝飾者實際上做了什麼。你能解釋一下嗎? – 3442

+0

當然!裝飾器改變函數的行爲,以便參數及其結果存儲在字典(緩存)中。當函數被調用時,它檢查函數是否已經被這些參數評估過。如果是這樣,函數查找並返回字典中的結果,而不是重新計算。 –

+0

哦,好主意!儘管如此,它要求函數是純粹的。但是,'__pycache__'與那個有什麼關係呢? **編輯**:現在我明白了;寫一個答案。 – 3442

回答

0

您應該...

  • 讓所有緩存在運行時發生:這勝過你的目的。但是,它是根本不接觸文件系統的唯一方法。
  • 專用文件夾,如__memo__或其他東西:這將允許您緩存多個執行。但是,您將「污染」應用程序的文件結構。

原因,你應該從未亂用__pycache__

  • __pycache__是CPython的特異性。雖然它最有可能是您現在使用的實現,但假設每個人都沒有任何理由,它不是可移植/安全/良好的做法。
  • __pycache__是作爲一個透明的優化,也就是說,沒有人應該在乎它是否存在。這是CPython人員的設計決定,所以你不應該繞過它。
  • 由於上述原因,如果用戶想要,上述目錄可能被禁用。例如,在CPython中,如果您執行python3 -B myapp.py,則不會創建__pycache__(如果它不存在),否則將被忽略。
  • 由於以上兩點,用戶經常刪除__pycache__,原因有幾個。至少,我這樣做。
  • __pycache__因爲「它不污染應用程序的文件結構」是一個錯覺。該目錄完全可以被視爲「污染」。如果Python解釋器已經污染了東西,爲什麼不能用__memo__呢?
+0

啊,我認爲一個額外的文件夾是要走的路,你在做出好的點。但請記住,如果它不存在,我們可以創建一個pycache文件夾。所以我認爲這不是一個可移植性問題,而是一個潛在的混亂原因:「我用-B運行了我的腳本,爲什麼現在有一個pycache文件夾?!」或「爲什麼我的功能沒有記憶?我所做的只是刪除pycache文件夾......」 –

+0

嗯,這些觀點並不能說服我。他們中的大多數實際上是將記憶存儲在相同目錄中的參數。也許可以檢測-B開關,然後開始記憶。我們可以將memoization看作優化的一種形式,所以如果用戶刪除'__pycache__',也許可以重新啓動memoization。 – Mitar

相關問題