2014-09-02 59 views
0

我正在從Windows計算機上的網絡驅動器(NAS上的CIFS共享)執行一個沉重的glob操作。 (CPython,v2.7.6)python性能的後續調用os.listdir

文件夾「項目」包含1到15 840個文件和1232個文件夾。

(我usinf它調用os.listdir()遞歸glob模塊)

以下腳本加載在空閒和我做「運行模塊」多次

import timeit 
import glob 

globPath = u'Z:/Project/*/*/*/*' 

def native_glob(): 
    glob.glob(globPath)) 

print timeit.timeit(native_glob, number=1) 

第一呼叫:

>>> 64.4641505602 

下一個和所有其他呼叫(+ - 0.5秒):

>>> 2.07747177124 

(該命令返回4125個文件)

第一呼叫高度取決於網絡電荷時,它是在一個範圍從100秒至40秒,但隨後的調用總是圍繞每個2秒。

它看起來像是有一個這樣的緩存機制。

  • 任何人都可以重現此行爲嗎?
  • 這是隻與Windows有關還是來自python?

回答

1

Python不會執行任何緩存os.listdir()調用,這完全取決於Windows。

任何網絡目錄列表在緩存之前都會很慢,並且遠程網絡共享驅動器上的文件夾列表也不例外。

+0

所以我想我無法控制緩存發生的方式。奇蹟般的高效,但緩存不一致,我不知道什麼時候會被釋放。我正在比較一個自定義的緩存,但它總是比較慢(顯然,如果我將基於字典的緩存與os本機緩存系統進行比較) – 2014-09-02 14:39:09

+0

您無法緩存未先檢索的內容,並且緩存需要稀疏資源:內存,所以操作系統可以並且將會清理一些東西,讓更多的東西變得更迫切需要緩存一段時間。此外,您需要避免緩存太多或太長,以免您獲取過時的信息。 – 2014-09-02 14:40:16

+0

是的,我將修改時間存儲在緩存層次結構中,以便我可以相應地更新它。 – 2014-09-02 14:46:44