簡體   English   中英

最有效的遍歷文件結構Python的方法

[英]Most efficient way to traverse file structure Python

是否以最耗時的方式使用os.walk以遞歸方式搜索文件夾並返回以.tnt結尾的所有文件?

for root, dirs, files in os.walk('C:\\data'):
    print "Now in root %s" %root
    for f in files:
        if f.endswith('.tnt'):

是的,使用os.walk確實是最好的方法。

正如大家所說, os.walk幾乎肯定是最好的方式。

如果你確實遇到性能問題,並且分析表明它是由os.walk引起的(和/或用.endswith迭代結果),那么你最好的答案可能就是走出Python。 將以上所有代碼替換為:

for f in sys.argv[1:]:

現在您需要一些可以收集路徑並運行腳本的外部工具。 (理想情況下,在每個腳本執行中盡可能多地批處理路徑。)

如果您可以依賴索引驅動器的Windows桌面搜索,則只需要執行快速數據庫操作即可查找具有特定擴展名的特定路徑下的所有文件。 我不知道如何編寫運行該查詢的批處理文件,並將結果作為傳遞給Python腳本的參數列表(或運行查詢的PowerShell文件,並將結果傳遞給IronPython而不將其序列化為列表) (參數),但在其他任何事情之前進行研究是值得的。

如果你不能依賴平台的桌面搜索索引,在任何POSIX平台上,使用這個單行shell腳本幾乎肯定是最快和最簡單的:

find /my/path -name '*.tnt' -exec myscript.py {} +

不幸的是,你不是在POSIX平台上,你在Windows上,它沒有find工具,這就是在這里做所有繁重的工作。

有本地Windows的查找端口,但你必須弄清楚命令行的復雜性,以便正確引用所有內容並格式化路徑等等,這樣你就可以編寫單行批處理文件。 或者,您可以安裝cygwin並使用您在POSIX系統上使用的完全相同的shell腳本。 或者你可以找到一個更符合你需要的Windows-y工具。

這可能比較慢而不是更快 - Windows不是設計用盡可能少的開銷執行大量的小進程,我相信它比linux或OS X這樣的平台對命令行有更小的限制,所以你可能會花更多的錢等待翻譯開始和退出的時間比你保存。 你必須測試才能看到。 實際上,您可能希望測試native和cygwin版本(在后一種情況下使用native和cygwin Python)。

您實際上不必find調用移動到批處理/ shell腳本中; 它可能是最簡單的答案,但還有其他一些,例如使用subprocess從Python中調用find 這可能會解決因啟動解釋器太多次而導致的性能問題。

獲得適當數量的並行性也可能有助於將腳本的每次調用分離到后台,而不是等待它們完成。 (我相信在Windows上,shell不參與其中;相反,有一個名為“run”的工具可以啟動與shell分離的進程。但我不記得細節。)

如果這些都不成功,你可能必須編寫一個自定義的C擴展,它可以做最快的Win32或.NET(這也意味着你必須進行研究以找出它是什么......)所以你可以從在Python中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM