2017-10-10 89 views
3

假設我想導入一個用於函數內部的python庫。在函數中導入庫還是全局導入它更好?函數內導入python庫與全局導入之間的區別?

做這個

def test_func: 
    import pandas as pd 
    # code implementation 

,或者在Python文件的頂部線下在全球範圍內導入?

import pandas as pd 

每種方法的優缺點是什麼? python中的最佳做法是什麼?

我使用python V3.6

編輯:一些澄清之作。

假設我有2個函數。

def func1: 
    import pandas as pd 
    # code implementation 

def func2: 
    import pandas as pd 
    # code implementation 

python腳本運行這兩個函數。庫會被導入兩次還是Python編譯器足夠聰明,只能導入一次?這具有性能影響。

回答

3

這是名稱可見性和執行時間點的差異。當你正在加載的文件被導入或運行時,模塊級導入被導入。顯然只有在函數運行時纔有本地函數。導入的名稱對文件中的所有內容都是可見的,或者僅在執行導入的函數內。

由於敲入導入語句(儘管很小但仍然),因此本地一會總是執行,而不只是一次。它不會完全重新導入模塊,python會在第一次導入模塊時緩存模塊(請參閱reloadsys.modules)。

最好的做法顯然是使用模塊級導入,這就是您在99.999%的代碼中看到的結果。一個巨大的原因是可維護性 - 如果您想了解某個模塊具有哪些依賴關係,只需查看頂部就可以了,而不必梳理所有代碼。

那麼何時使用函數local import?

有三種情況:

  • 你不能使用導入較早。這發生在例如通過配置或系統檢查在運行時選擇數據庫或其他系統/功能的後端。

  • 否則你有循環進口。這是一種罕見的情況,也是一種代碼異味,所以如果有必要的話,可以考慮重構。

  • 通過延遲模塊導入來減少啓動時間。但這很少有用。

所以對於你的情況,答案是一個快速和簡單的「不要這樣做」。

+0

我對這個問題做了一些編輯以作進一步的說明。你願意幫忙嗎?謝謝。 – user3848207

1

模塊在導入時會被加載,所以如果你需要導入一個很少使用的模塊但花費大量的時間來初始化,你應該在需要時導入它。其實,如果我們只關心性能而不是可讀性,那麼在我們真正需要的時候導入模塊可能會更好。

但是我們需要保持程序的可維護性。導入頂部的所有模塊是告訴其他人並自行創建使用哪個模塊的最直接方式。總之,如果你真的有一個非常昂貴但很少使用的模塊,你應該在本地導入它。否則,你應該將它們導入頂部。

+0

您對性能的評論有誤導性。導入將始終在函數運行時執行。雖然模塊本身在緩存時不會被重新加載,但它會執行代碼。好的維護! – deets

+0

@deets看來你誤解了我的意思是「維護」?當然,我知道重新導入模塊只是使用緩存,但是您是否想在一個大型項目中的整個文件中找到所有使用的模塊? – Sraw

+0

我對這個問題做了一些編輯以作進一步的說明。你願意幫忙嗎?謝謝。 – user3848207

相關問題