2010-07-02 86 views
3

我正在使用python來解析傳入的逗號分隔字符串。之後我想對數據做一些計算。 字符串的長度是:800個字符,包含120個以逗號分隔的字段。 有120萬個字符串需要處理。Python快速字符串解析,操作

for v in item.values(): 
     l.extend(get_fields(v.split(','))) 
#process l 

get_fields使用operator.itemgetter()以提取約20字段總分120

這整個操作大約需要4-5分鐘不計時間在數據帶。 在程序的後面部分,我將這些行插入sqlite內存表以供進一步使用。 但是,僅僅解析和獲取列表的整體4-5分鐘時間並不適合我的項目。

我在6-8線程左右運行這個處理。

切換到C/C++可能有幫助嗎?

+1

你正在調用一個需要遍歷800個字符的函數,並且你正在做這個函數超過一百萬次。即使是電腦,也需要處理很多。 – tlayton 2010-07-02 19:32:26

+2

http://docs.python.org/library/csv.html – kennytm 2010-07-02 19:34:22

+1

如果你打算重新發明輪子,你應該看看這篇文章:http://stackoverflow.com/questions/3055477/how-slow- is-pythons-string-concatenation-vs-str-join你也應該看看generator。 – 2010-07-02 19:40:49

回答

2

您的程序可能會放慢嘗試爲1.2M字符串分配足夠的內存。換句話說,速度問題可能不是由於字符串解析/操作,而是由於l.extend。爲了測試這個hypothsis,你可以把一個print語句在循環:

for v in item.values(): 
    print('got here') 
    l.extend(get_fields(v.split(','))) 

如果打印報表越來越慢,你或許可以得出結論:l.extend是罪魁禍首。在這種情況下,如果您可以將每一行的處理移動到循環中,您可能會看到顯着的速度提升。 PS:您可能應該使用csv模塊以更高級的方式爲您處理解析,但我認爲這不會對速度造成太大影響。

+1

timeit模塊(http://docs.python.org/library/timeit.html)可能有助於確定事情需要多長時間。 – GreenMatt 2010-07-02 20:04:47

+1

我提出了一個快速和骯髒的方法,因爲如果你不能*看到*明顯的減速,那麼內存分配不是問題。 – unutbu 2010-07-02 20:10:25

2

您是否正在爲您的文件記錄加載字典?可能更好地直接處理數據:

datafile = file("file_with_1point2million_records.dat") 
# uncomment next to skip over a header record 
# file.next() 

l = sum(get_fields(v.split(',')) for v in file, []) 

這避免了在創建任何整體的數據結構,並且僅通過作爲get_fields返回積累所需的值。