2017-03-18 41 views
0

我越來越多地使用python而不是perl,但有一個問題:總是當我想處理大型文件(> 1GB)時,逐行python似乎需要一段時間才能完成perl在一小部分時間內完成的工作。然而,網絡上的一般看法似乎是python應該至少和文本處理一樣快。所以我的問題是我做錯了什麼?Python比大文件慢perl:我做錯了什麼?

實施例:

逐行讀取一個文件中的行,分割線在每一個片和所述第二項添加到列表中。 我的Python的解決方案將是這個樣子:

with open() as infile: 
    for line in infile: 
     ls = line.split("\t") 
     list.append(ls[1]) 

Perl代碼應該是這樣的:

open(my $infile,"<",file_path); 
while(my $line=<$infile>){ 
    my @ls = split(/\t/,$line); 
    push @list, $ls[1] 
} 
close($infile) 

有什麼辦法來加快這個嗎?

而且要說清楚:我不想開始平常的「[填寫腳本語言A的名稱]比so [填充腳本語言B]好得多」的線程。我想更多地使用python,這對我的工作是一個真正的問題。

有什麼建議嗎?

+0

一旦你擁有它,你想用'list'做什麼? Python對生成器和迭代器有很好的支持,你可以在追加到全局變量的內部產生ls [1]'。 –

+0

我們在這裏談論的是什麼樣的性能差異? –

+3

我通過一個包含1000萬行「foo \ tbar \ tbaz \ tbiff \ n」的簡單CSV文件,在[等效的Perl代碼](https://gist.github.com/schwern/0e81307f0be0cce37aad9c0ac5fd3045)上運行您的代碼, Python代碼運行速度快兩倍。你能展示你的等價的Perl代碼嗎?另外,你的代碼不是真實的,'open'缺少參數。你能向我們展示* real *代碼嗎?最後,爲什麼你認爲這些代碼是性能問題? – Schwern

回答

1

有什麼辦法可以加快速度嗎?

是,import the CSV in SQLite and process it there。在你的情況下,你想要.mode tabs而不是.mode csv

使用任何編程語言來操縱CSV文件將會很慢。 CSV是數據轉換格式,而不是數據存儲格式。由於您經常對CSV文件進行重新處理和重新處理,因此他們總是很慢並且很難處理。

將它導入到SQLite將使它成爲一個更有效的索引數據格式。它需要的時間和Python一樣多,但只需要做一次。它可以使用SQL來處理,這意味着更少的代碼來編寫,調試和維護。

請參閱Sqlite vs CSV file manipulation performance

+0

感謝您的建議,但鑑於我必須在我們的計算集羣上使用NFS,SQLite不是一個選項(已經這樣做了,並且由於已知的「數據庫鎖定」問題而丟失了兩次數據庫)。此外,我的Perl代碼運行速度相當快,但如前所述,我認爲可能有一種「漂亮」的方式使用Python。 無論如何感謝 – Lowry