我有一個大的ASCII文件(〜100GB),其中包含大約1.000.000行已知格式的數字,我嘗試使用python 。該文件是太大,無法讀取完全到內存中,所以我決定用線來處理文件行:什麼是最快的方式在Python中轉換字符串格式化數字在一個numpy陣列
fp = open(file_name)
for count,line in enumerate(fp):
data = np.array(line.split(),dtype=np.float)
#do stuff
fp.close()
事實證明,我花費在data =
行我大部分的程序的運行時間。有什麼方法來加速這條線?另外,執行速度似乎比我從原生FORTRAN程序的格式化讀取要慢得多(請參閱此question,我實現了FORTRAN字符串處理器並將其與f2py一起使用,但運行時間僅與data =
我猜想Python/FORTRAN之間的I/O處理和類型轉換會導致我從FORTRAN中獲得的東西被殺死)
因爲我知道格式化,所以不應該有更好更快的方法來使用split()
?喜歡的東西:
data = readf(line,'(1000F20.10)')
我試過fortranformat包,效果不錯,但在我的情況比你split()
方法要慢三倍。
P.S.正如EXP和根建議我嘗試了np.fromstring並使它快速dirtry基準:
t1 = time.time()
for i in range(500):
data=np.array(line.split(),dtype=np.float)
t2 = time.time()
print (t2-t1)/500
print data.shape
print data[0]
0.00160977363586
(9002,)
0.0015162509
和:
t1 = time.time()
for i in range(500):
data = np.fromstring(line,sep=' ',dtype=np.float,count=9002)
t2 = time.time()
print (t2-t1)/500
print data.shape
print data[0]
0.00159792804718
(9002,)
0.0015162509
所以fromstring
其實是在我的情況稍微慢一些。
您應該查看用於測試這些小片段的[timeit](http://docs.python.org/2/library/timeit.html)模塊。 – DSM 2013-04-10 10:08:48