24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 2139  |  回复: 9
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

yjcmwgk

禁虫 (文坛精英)

密度泛函·小卒

优秀版主

[求助] 用Python读Gaussian的cube文件,速度很慢,怎么破?谢谢!!! 已有4人参与

向各位python大侠求教一个问题,谢谢各位!
我正在用python读一个由Gaussian生成的cube文件。但是读文件读得非常慢,读一个6M多的cube文件,居然用了3分钟!

具体问题如下:
用cubefile来打开某个cube文件。然后继续
CODE:
    tmpcubedata = [] !先设一个空列表,待会儿用来存储数据
    tmpcubedata = tmpcubedata + tmpline.split() !tmpline是用来存储某一行的数据的。由于先前已经经过了多次tmpline.split()之后,实际上现在的tmpline存储的就是我已经想要的那些数据的第一行了。所以,先读一下并存入tmpcubedata中。
    i = 1 !这是个计数器。每读一行数据就加1
    tmplines=cubefile.readlines() !把剩下的行全读进来
    for i in range(1,linecount): !linecount就是应该读入的cube文件中数据部分的总行数,一般来说,Gaussian生成的cube文件中,如果生成过程全默认,那么cube文件的数据部分应该是8-9万行的样子。大部分行,每行有6个数字(大概95%的行是这样的),但也不排除只有1-5个数字的情况(大概5%的行是这样的)。
        tmpline = tmplines[i-1] !从tmplines中获得某一行
        if tmpline == 'EOF' : break
        if tmpline == [] : break
        if tmpline == None : break
        if i == linecount: break !如果计数器i达到了总行数,就不读了
        if i%10000 == 0: print "Converting", cubefilename, "......  ", int(100.0*float(i)/float(linecount)), "%" !每读一万行数据,就显示一个进度百分比
        if i == linecount-1 : print "Converting", cubefilename, "...... ", "100 %" !读到最后一行数据的时候,就显示一个百分之百
        i = i+1
        tmpcubedata = tmpcubedata + tmpline.split() !将读进来的数据存入tmpcubedata中

我怀疑tmpline = tmplines[i-1]这句话拖累的速度?应该如何修改?非常感谢高手帮助!!
感谢!!
回复此楼

» 收录本帖的淘帖专辑推荐

SOB 集锦 经验 杂书

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

rh1127

捐助贵宾 (著名写手)

一名工程师@上海

引用回帖:
5楼: Originally posted by magicmonk at 2014-10-05 09:50:45
个人呢建议用fortran或MATLAB

fortran和Matlab都太庞大臃肿和不优雅了,python最直接简洁,是未来之星。
Actionnoworachievenever!
10楼2014-10-05 19:31:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 10 个回答

yjcmwgk

禁虫 (文坛精英)

密度泛函·小卒

优秀版主

cube文件的基本结构举例如下
CODE:
Title Card Required mo=1
MO coefficients
   -1   -2.916225   -2.916225   -2.916225
   80    0.073828    0.000000    0.000000
   80    0.000000    0.073828    0.000000
   80    0.000000    0.000000    0.073828
    2    2.000000    0.000000    0.000000    0.000000
    1    1
  7.36784E-05  8.36290E-05  9.46155E-05  1.06698E-04  1.19934E-04  1.34374E-04
  1.50064E-04  1.67044E-04  1.85341E-04  2.04976E-04  2.25955E-04  2.48274E-04
  2.71913E-04  2.96838E-04  3.22995E-04  3.50318E-04  3.78721E-04  4.08098E-04
  4.38328E-04  4.69271E-04  5.00768E-04  5.32647E-04  5.64718E-04  5.96779E-04
  6.28614E-04  6.60000E-04  6.90707E-04  7.20497E-04  7.49136E-04  7.76386E-04
  8.02019E-04  8.25811E-04  8.47551E-04  8.67043E-04  8.84107E-04  8.98583E-04
  9.10334E-04  9.19248E-04  9.25239E-04  9.28250E-04  9.28250E-04  9.25239E-04
  9.19248E-04  9.10334E-04  8.98583E-04  8.84107E-04  8.67043E-04  8.47551E-04
  8.25811E-04  8.02019E-04  7.76386E-04  7.49136E-04  7.20497E-04  6.90707E-04
  6.60000E-04  6.28614E-04  5.96779E-04  5.64718E-04  5.32647E-04  5.00768E-04
  4.69271E-04  4.38328E-04  4.08098E-04  3.78721E-04  3.50318E-04  3.22995E-04
  2.96838E-04  2.71913E-04  2.48274E-04  2.25955E-04  2.04976E-04  1.85341E-04
  1.67044E-04  1.50064E-04  1.34374E-04  1.19934E-04  1.06698E-04  9.46155E-05
  8.36290E-05  7.36784E-05
  8.36290E-05  9.49233E-05  1.07394E-04  1.21108E-04  1.36131E-04  1.52521E-04
  1.70331E-04  1.89603E-04  2.10372E-04  2.32658E-04  2.56471E-04  2.81805E-04
  3.08636E-04  3.36926E-04  3.66617E-04  3.97630E-04  4.29868E-04  4.63213E-04
下面还有八万多行,略了

对于这个cube文件来说,从第9行开始是第一个数据行,直到文件结束。值得注意的是,绝大多数数据行,每行有6个数字,但第22行就只有2个数字了。
2楼2014-10-04 11:08:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

frk2008

木虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
yjcmwgk: 金币+20, 有帮助, 非常感谢,我后来用tmpp = ((' '.join(cubefile.readlines())).replace("/n"," ")).split()解决了 2014-10-05 16:10:10
gmy1990: 金币+3 2014-10-05 18:49:03
试试这个,看看效果如何:

[ code]

tmplines = cubefile.readlines()  
tempstr = "".join(tmplines)             #把list转化为str,形式应该是'num  num  ...num\nnum  ...'
tempstr = tempstr.replace('\n','  ')    #把str中的'\n'替换为'  '
tmpcubedata = tempstr.split('  ')       #把str转为list
n=0
numcount=len(tmpcubedata)               #list的数据总数
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‘结尾
print "Converting", cubefilename, "...... ", "100 %"

[ /code]
3楼2014-10-04 15:23:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

rh1127

捐助贵宾 (著名写手)

一名工程师@上海

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
yjcmwgk: 金币+20, 有帮助, 非常感谢,我后来用tmpp = ((' '.join(cubefile.readlines())).replace("/n"," ")).split()解决了 2014-10-05 16:10:21
gmy1990: 金币+2 2014-10-05 18:49:14
用numpy和pandas模块儿来处理大型数组,比只用for循环速度快几十倍不止。python自带的循环未经优化,很忌讳来处理大型数组!
希望对你有帮助。
Actionnoworachievenever!
4楼2014-10-05 09:21:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 材料科学与工程求调剂 +7 深V宿舍吧 2026-03-29 7/350 2026-03-30 20:43 by dophin1985
[考研] 085600 295分求调剂 +7 W55j 2026-03-30 9/450 2026-03-30 20:36 by dick_runner
[考研] 359求调剂 +5 王了个楠 2026-03-25 5/250 2026-03-30 19:36 by 源_2020
[考研] 085601材料工程找调剂 +17 oatmealR 2026-03-29 18/900 2026-03-30 19:21 by Wang200018
[考研] 26考研-291分-厦门大学(085601)-柔性电子学院材料工程专业求调剂 +5 min3 2026-03-24 6/300 2026-03-30 18:42 by 544594351
[考研] 292求调剂 +13 是妍子也是研子 2026-03-30 13/650 2026-03-30 18:01 by 小徐0109
[考研] 262求调剂 +4 ZZ..000 2026-03-30 4/200 2026-03-30 15:57 by wangjy2002
[考研] 329求调剂,一志愿西北工业大学,材料工程(085601) +5 小小机灵虫 2026-03-29 11/550 2026-03-30 15:02 by Wang200018
[考研] 0703化学 +14 妮妮ninicgb 2026-03-27 14/700 2026-03-30 12:46 by fangnagu
[考研] 332求调剂 +6 Lyy930824@ 2026-03-29 6/300 2026-03-30 10:53 by 1172367218
[考研] 一志愿中南大学化学0703总分337求调剂 +6 niko- 2026-03-27 6/300 2026-03-30 10:25 by herarysara
[考研] 330分求调剂 +5 qzenlc 2026-03-29 5/250 2026-03-29 07:37 by 无际的草原
[考研] 071000生物学求调剂,初试成绩343 +7 小小甜面团 2026-03-25 7/350 2026-03-28 20:25 by 唐沐儿
[考研] 312,生物学求调剂 +3 小译同学abc 2026-03-28 3/150 2026-03-28 15:32 by 落睿可思
[考研] 347求调剂 +3 山顶见α 2026-03-25 3/150 2026-03-28 14:13 by 唐沐儿
[考研] 安徽大学专硕生物与医药专业(086000)324分,英语已过四六级,六级521,求调剂 +4 美味可乐鸡翅 2026-03-26 4/200 2026-03-27 15:27 by 星空星月
[考研] 求调剂 一志愿 本科 北科大 化学 343 +6 13831862839 2026-03-24 7/350 2026-03-26 22:57 by 不吃魚的貓
[考研] 环境专硕324分求调剂推荐 +5 轩小宁—— 2026-03-26 5/250 2026-03-26 12:05 by i_cooler
[考研] 285求调剂 +3 AZMK 2026-03-24 3/150 2026-03-25 12:23 by userper
[考研] 调剂 +4 13853210211 2026-03-24 4/200 2026-03-24 19:44 by ms629
信息提示
请填处理意见