| 10 | 1/1 | 返回列表 |
| 查看: 2112 | 回復(fù): 9 | |||||
yjcmwgk禁蟲 (文壇精英)
密度泛函·小卒
|
[求助]
用Python讀Gaussian的cube文件,速度很慢,怎么破?謝謝!。 已有4人參與
|
|
向各位python大俠求教一個問題,謝謝各位! 我正在用python讀一個由Gaussian生成的cube文件。但是讀文件讀得非常慢,讀一個6M多的cube文件,居然用了3分鐘! 具體問題如下: 用cubefile來打開某個cube文件。然后繼續(xù) 我懷疑tmpline = tmplines[i-1]這句話拖累的速度?應(yīng)該如何修改?非常感謝高手幫助! 感謝!! |
SOB 集錦 | 經(jīng)驗 | 雜書 |
禁蟲 (文壇精英)
密度泛函·小卒
木蟲 (正式寫手)
|
試試這個,看看效果如何: [ code] tmplines = cubefile.readlines() tempstr = "".join(tmplines) #把list轉(zhuǎn)化為str,形式應(yīng)該是'num num ...num\nnum ...' tempstr = tempstr.replace('\n',' ') #把str中的'\n'替換為' ' tmpcubedata = tempstr.split(' ') #把str轉(zhuǎn)為list n=0 numcount=len(tmpcubedata) #list的數(shù)據(jù)總數(shù) for i in tmpcubedata: n+=1 if i%60000==0: print "Converting", cubefilename, "...... ", int(100.0*float(i)/float(numcount)), "%" #if i=="": #tmpcubedata.remove(i) #如果cubefile 文件中中間有空行,則需要這個功能 if tmpcubedata[-1]=="": del tmpcubedata[-1] #如果cubefile 文件以‘num\n‘結(jié)尾 print "Converting", cubefilename, "...... ", "100 %" [ /code] |
捐助貴賓 (著名寫手)
一名工程師@上海
|
用numpy和pandas模塊兒來處理大型數(shù)組,比只用for循環(huán)速度快幾十倍不止。python自帶的循環(huán)未經(jīng)優(yōu)化,很忌諱來處理大型數(shù)組! 希望對你有幫助。 |

至尊木蟲 (著名寫手)

捐助貴賓 (著名寫手)
一名工程師@上海
|
樓主,我親自給你code的標準答案: —————————————————————— import numpy as np import string def readCube2Array(cubeFile): f=open(cubeFile,'r') lines=f.readlines() i=-1 for l in lines: i=i+1 if string.find(l,'E-')>0: break print i #找到第一行你需要存的數(shù)據(jù) s=(''.join(lines[i:])).replace(" "," " #將所有雙空格換成一個空格s=s.replace("\n"," " #把所有換行符換成單個空格dataArray=np.fromstring(s,dtype=double, sep=' ') #調(diào)用numpy把字符串轉(zhuǎn)成double類型的數(shù)組 return dataArray #返回你要的數(shù)組 filename='test677-ref.cube' #這是我的測試文件,是一個高斯09自帶的cube文件,有九萬多行數(shù)據(jù) dArray=readCube2Array(filename) #這就是你想要的結(jié)果,根本不用看進度,瞬間完成 ——————————這個程序的執(zhí)行時間我也看了———————————————— %timeit dArray=readCube2Array(filename) 30 30 30 30 1 loops, best of 3: 380 ms per loop 大概是380ms就能執(zhí)行完一個cube文件的導(dǎo)出,我覺得絕對比你的程序塊不止幾十倍。 趕緊給分了,有問題給我留言! |

捐助貴賓 (著名寫手)
一名工程師@上海
|
import numpy as np import string def readCube2Array(cubeFile): f=open(cubeFile,'r') lines=f.readlines() i=-1 for l in lines: i=i+1 if string.find(l,'E-')>0: break print i s=(''.join(lines[i:])).replace(" "," " ) s=s.replace("\n"," " ) dataArray=np.fromstring(s,dtype=double, sep=' ') return dataArray filename='test677-ref.cube' dArray=readCube2Array(filename) |

捐助貴賓 (著名寫手)
一名工程師@上海

|
你的代碼不pythonic,不易讀也很低效, 這里給個例子,不知道是不是你要的功能 def readcube(cubefile): cubedata = [] with open(cubefile) as f: lines = f.readlines() # if cubefile is large, read it in streaming or blocks # handle headers here for line in lines[2:]: for item in line.split(): cubedata.append(eval(item)) return cubedata if __name__ == '__main__': testfile = 'test.cube' data = readcube(testfile) print(len(data)) print(data[:10]) print(data[-10:]) |
捐助貴賓 (著名寫手)
一名工程師@上海

| 10 | 1/1 | 返回列表 |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 085601材料工程專碩求調(diào)劑 +10 | 慕寒mio 2026-03-16 | 10/500 |
|
|---|---|---|---|---|
|
[考研] 321求調(diào)劑 +8 | 何潤采123 2026-03-18 | 8/400 |
|
|
[考研] 304求調(diào)劑 +3 | 曼殊2266 2026-03-18 | 3/150 |
|
|
[教師之家] 焦慮 +9 | 水冰月月野兔 2026-03-13 | 13/650 |
|
|
[考研] 0703化學(xué) 305求調(diào)劑 +4 | FY_yy 2026-03-14 | 4/200 |
|
|
[考研] 304求調(diào)劑 +6 | 司空. 2026-03-18 | 6/300 |
|
|
[考研] 收復(fù)試調(diào)劑生 +4 | 雨后秋荷 2026-03-18 | 4/200 |
|
|
[考研] 331求調(diào)劑(0703有機化學(xué) +7 | ZY-05 2026-03-13 | 8/400 |
|
|
[考研] 304求調(diào)劑 +12 | 小熊joy 2026-03-14 | 13/650 |
|
|
[考研] 299求調(diào)劑 +5 | △小透明* 2026-03-17 | 5/250 |
|
|
[考研] 0703化學(xué)調(diào)劑 +3 | 妮妮ninicgb 2026-03-17 | 3/150 |
|
|
[考研] 考研求調(diào)劑 +3 | 橘頌. 2026-03-17 | 4/200 |
|
|
[考研] 326求調(diào)劑 +5 | 上岸的小葡 2026-03-15 | 6/300 |
|
|
[考研] 283求調(diào)劑 +3 | 聽風就是雨; 2026-03-16 | 3/150 |
|
|
[考研] 22408總分284求調(diào)劑 +3 | InAspic 2026-03-13 | 3/150 |
|
|
[考研] 材料與化工 323 英一+數(shù)二+物化,一志愿:哈工大 本人本科雙一流 +4 | 自由的_飛翔 2026-03-13 | 5/250 |
|
|
[考研] 一志愿哈工大材料324分求調(diào)劑 +5 | 閆旭東 2026-03-14 | 5/250 |
|
|
[考研] [0860]321分求調(diào)劑,ab區(qū)皆可 +4 | 寶貴熱 2026-03-13 | 4/200 |
|
|
[考研] 290求調(diào)劑 +3 | ADT 2026-03-13 | 3/150 |
|
|
[考研] 333求調(diào)劑 +3 | 152697 2026-03-12 | 4/200 |
|