Julia 檔案的每個角落都充滿了“避免全域范圍變數”的提醒。但即使在一些最常見的資料分析場景中,我也看不出這有什么好處,這可能是由于對 Julia 編譯器的作業方式存在誤解。
例如,我使用的一個函式檢查檔案的每個標記是否屬于可接受標記的龐大詞典。目前,我使用這樣的東西:
using CSV, DataFrames
accepted_tokens = @chain begin
CSV.read("accepted_tokens.csv", DataFrame)
Set{String}(_.tokens)
end
function redact_document(doc::String)
tokens = split(doc, " ")
redacted_tokens = [token in accepted_tokens ? token : "REDACTED" for token in tokens]
return join(" ", redacted_tokens)
end
現在,既然redact_document是唯一的函式,accepted_tokens我當然可以在函式內部分配變數,如下所示:
function redact_document(doc::String)
accepted_tokens = @chain begin
CSV.read("accepted_tokens.csv", DataFrame)
Set{String}(_.tokens)
end
tokens = split(doc, " ")
redacted_tokens = [token in accepted_tokens ? token : "REDACTED" for token in tokens]
return join(" ", redacted_tokens)
end
我不這樣做的原因是,在我看來,在這種情況下,每次呼叫都accedted_tokens需要分配,這似乎完全是浪費時間,因為我必須從磁盤讀取一個巨大的檔案每次,而不是只創建/分配一次變數(盡管在全域范圍內)。我也不想宣告為常量,因為我可能想在開發腳本時調整詞典。redact_documentaccepted_tokens
我對代碼的閱讀是否正確?或者,正如我所懷疑的,編譯器比我想象的要聰明,我仍然應該將變數包裝在使用它們的函式中?
uj5u.com熱心網友回復:
雖然所有的都在評論中說了,但為了簡潔起見,你的代碼應該是這樣的(你應該accepted_tokens作為引數傳遞而不是使用全域變數):
function redact_document(doc::AbstractString, accepted_tokens::AbstractSet{<:AbstractString})
tokens = split(doc, " ")
redacted_tokens = [token in accepted_tokens ? token : "REDACTED" for token in tokens]
return join(" ", redacted_tokens)
end
函式引數的型別宣告是可選的(不影響性能),但如果您通常使用它們,最好使用它們的抽象對應物。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519852.html
標籤:表现范围朱莉娅全局变量
