| 24小時(shí)熱門(mén)版塊排行榜 |
| 10 | 1/1 | 返回列表 |
| 查看: 2111 | 回復(fù): 9 | |||||
yjcmwgk禁蟲(chóng) (文壇精英)
密度泛函·小卒
|
[求助]
用Python讀Gaussian的cube文件,速度很慢,怎么破?謝謝。。 已有4人參與
|
|
向各位python大俠求教一個(gè)問(wèn)題,謝謝各位! 我正在用python讀一個(gè)由Gaussian生成的cube文件。但是讀文件讀得非常慢,讀一個(gè)6M多的cube文件,居然用了3分鐘! 具體問(wèn)題如下: 用cubefile來(lái)打開(kāi)某個(gè)cube文件。然后繼續(xù) 我懷疑tmpline = tmplines[i-1]這句話(huà)拖累的速度?應(yīng)該如何修改?非常感謝高手幫助!! 感謝!! |
SOB 集錦 | 經(jīng)驗(yàn) | 雜書(shū) |
禁蟲(chóng) (文壇精英)
密度泛函·小卒
木蟲(chóng) (正式寫(xiě)手)
|
試試這個(gè),看看效果如何: [ 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 文件中中間有空行,則需要這個(gè)功能 if tmpcubedata[-1]=="": del tmpcubedata[-1] #如果cubefile 文件以‘num\n‘結(jié)尾 print "Converting", cubefilename, "...... ", "100 %" [ /code] |
捐助貴賓 (著名寫(xiě)手)
一名工程師@上海
|
用numpy和pandas模塊兒來(lái)處理大型數(shù)組,比只用for循環(huán)速度快幾十倍不止。python自帶的循環(huán)未經(jīng)優(yōu)化,很忌諱來(lái)處理大型數(shù)組! 希望對(duì)你有幫助。 |

至尊木蟲(chóng) (著名寫(xiě)手)

捐助貴賓 (著名寫(xiě)手)
一名工程師@上海
|
樓主,我親自給你code的標(biāo)準(zhǔn)答案: —————————————————————— 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(" "," " #將所有雙空格換成一個(gè)空格s=s.replace("\n"," " #把所有換行符換成單個(gè)空格dataArray=np.fromstring(s,dtype=double, sep=' ') #調(diào)用numpy把字符串轉(zhuǎn)成double類(lèi)型的數(shù)組 return dataArray #返回你要的數(shù)組 filename='test677-ref.cube' #這是我的測(cè)試文件,是一個(gè)高斯09自帶的cube文件,有九萬(wàn)多行數(shù)據(jù) dArray=readCube2Array(filename) #這就是你想要的結(jié)果,根本不用看進(jìn)度,瞬間完成 ——————————這個(gè)程序的執(zhí)行時(shí)間我也看了———————————————— %timeit dArray=readCube2Array(filename) 30 30 30 30 1 loops, best of 3: 380 ms per loop 大概是380ms就能執(zhí)行完一個(gè)cube文件的導(dǎo)出,我覺(jué)得絕對(duì)比你的程序塊不止幾十倍。 趕緊給分了,有問(wèn)題給我留言! |

捐助貴賓 (著名寫(xiě)手)
一名工程師@上海
|
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) |

捐助貴賓 (著名寫(xiě)手)
一名工程師@上海
| 第一個(gè)論壇自動(dòng)轉(zhuǎn)成表情了,你用第二個(gè)吧,都能運(yùn)行。趕緊給分哦:) |

|
你的代碼不pythonic,不易讀也很低效, 這里給個(gè)例子,不知道是不是你要的功能 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:]) |
捐助貴賓 (著名寫(xiě)手)
一名工程師@上海

| 10 | 1/1 | 返回列表 |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 321求調(diào)劑 +7 | 何潤(rùn)采123 2026-03-18 | 7/350 |
|
|---|---|---|---|---|
|
[考研] 材料考研調(diào)劑 +3 | xwt。 2026-03-19 | 3/150 |
|
|
[考研] 267一志愿南京工業(yè)大學(xué)0817化工求調(diào)劑 +10 | SUICHILD 2026-03-12 | 10/500 |
|
|
[考研] 求材料調(diào)劑 +10 | 隔壁陳先生 2026-03-12 | 10/500 |
|
|
[考研] 085700資源與環(huán)境308求調(diào)劑 +3 | 墨墨漠 2026-03-18 | 3/150 |
|
|
[考研] 一志愿武理材料305分求調(diào)劑 +5 | 想上岸的鯉魚(yú) 2026-03-18 | 6/300 |
|
|
[考研] 26調(diào)劑/材料/英一數(shù)二/總分289/已過(guò)A區(qū)線 +7 | 步川酷紫123 2026-03-13 | 7/350 |
|
|
[考研] 286求調(diào)劑 +6 | lemonzzn 2026-03-16 | 9/450 |
|
|
[考研] 化學(xué)工程321分求調(diào)劑 +15 | 大米飯! 2026-03-15 | 18/900 |
|
|
[考研] 0854可跨調(diào)劑,一作一項(xiàng)核心論文五項(xiàng)專(zhuān)利,省、國(guó)級(jí)證書(shū)40+數(shù)一英一287 +8 | 小李0854 2026-03-16 | 8/400 |
|
|
[考研] 304求調(diào)劑 +12 | 小熊joy 2026-03-14 | 13/650 |
|
|
[考研] 334求調(diào)劑 +3 | 志存高遠(yuǎn)意在機(jī)?/a> 2026-03-16 | 3/150 |
|
|
[考研] 332求調(diào)劑 +6 | Zz版 2026-03-13 | 6/300 |
|
|
[考研]
|
zhouzhen654 2026-03-16 | 3/150 |
|
|
[考研] 中科院材料273求調(diào)劑 +4 | yzydy 2026-03-15 | 4/200 |
|
|
[考研] 求老師收留調(diào)劑 +4 | jiang姜66 2026-03-14 | 5/250 |
|
|
[考博] 東華理工大學(xué)化材專(zhuān)業(yè)26屆碩士博士申請(qǐng) +6 | zlingli 2026-03-13 | 6/300 |
|
|
[考研] 中科大材料與化工319求調(diào)劑 +3 | 孟鑫材料 2026-03-14 | 3/150 |
|
|
[考研] 復(fù)試調(diào)劑 +3 | 呼呼?~+123456 2026-03-14 | 3/150 |
|
|
[考研] 工科材料085601 279求調(diào)劑 +8 | 困于星晨 2026-03-12 | 10/500 |
|