24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 2142  |  回复: 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]这句话拖累的速度?应该如何修改?非常感谢高手帮助!!
感谢!!
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

rh1127

捐助贵宾 (著名写手)

一名工程师@上海

【答案】应助回帖

楼主,我亲自给你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 #找到第一行你需要存的数据
   
    s=(''.join(lines[i:])).replace("  "," " #将所有双空格换成一个空格
    s=s.replace("\n"," " #把所有换行符换成单个空格
    dataArray=np.fromstring(s,dtype=double, sep=' ') #调用numpy把字符串转成double类型的数组
    return dataArray #返回你要的数组

filename='test677-ref.cube' #这是我的测试文件,是一个高斯09自带的cube文件,有九万多行数据
dArray=readCube2Array(filename) #这就是你想要的结果,根本不用看进度,瞬间完成

——————————这个程序的执行时间我也看了————————————————


%timeit dArray=readCube2Array(filename)
















30
30
30
30
1 loops, best of 3: 380 ms per loop
大概是380ms就能执行完一个cube文件的导出,我觉得绝对比你的程序块不止几十倍。

赶紧给分了,有问题给我留言!
Actionnoworachievenever!
6楼2014-10-05 14:43:33
已阅   回复此楼   关注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的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 求调剂,一志愿 南京航空航天大学 ,080500材料科学与工程学硕,总分289分 +9 @taotao 2026-03-29 9/450 2026-03-30 22:29 by 我是小康
[考研] 285求调剂 +6 AZMK 2026-03-29 9/450 2026-03-30 21:02 by dophin1985
[考研] 各位老师好,我的一志愿为北京科技大学085601材料专硕 +10 Koxui 2026-03-28 10/500 2026-03-30 19:33 by 源_2020
[考研] 化工专硕求调剂 +5 question挽风 2026-03-24 5/250 2026-03-30 18:34 by tianyyysss
[考研] 334分 一志愿武理 材料求调剂 +16 李李不服输 2026-03-26 16/800 2026-03-30 17:47 by wangjy2002
[考研] 化学0703 调剂 306分 一志愿211 +8 26要上岸 2026-03-28 8/400 2026-03-30 16:39 by herarysara
[考研] 考研调剂 +5 Sanmu-124 2026-03-26 5/250 2026-03-30 13:36 by chemdavid
[考研] 0703化学 +14 妮妮ninicgb 2026-03-27 14/700 2026-03-30 12:46 by fangnagu
[考研] 化学工程085602 305分求调剂 +25 RichLi_ 2026-03-25 25/1250 2026-03-30 11:02 by klasasda
[考研] 305求调剂 +8 RuiFairyrui 2026-03-28 8/400 2026-03-29 08:22 by fmesaito
[考研] 320分,材料与化工专业,求调剂 +9 一定上岸aaa 2026-03-27 13/650 2026-03-28 15:00 by 神马都不懂
[考研] 286求调剂 +4 丢掉懒惰 2026-03-27 7/350 2026-03-28 08:07 by baoball
[考研] 295求调剂 +5 1428151015 2026-03-27 6/300 2026-03-28 04:04 by fmesaito
[考研] 330一志愿中国海洋大学 化学工程 085602 有读博意愿 求调剂 +3 wywy.. 2026-03-27 4/200 2026-03-28 03:32 by fmesaito
[考研] 一志愿上海理工能源动力(085800)310分求调剂 +3 zhangmingc 2026-03-27 4/200 2026-03-27 19:01 by 给你你注意休息
[考研] 308求调剂 +7 墨墨漠 2026-03-25 7/350 2026-03-27 14:47 by 狂炫麦当当
[考研] 08开头275求调剂 +4 拉谁不重要 2026-03-26 4/200 2026-03-27 14:12 by Delta2012
[考研] 302求调剂 +4 锦衣卫藤椒 2026-03-25 4/200 2026-03-25 16:29 by 功夫疯狂
[考研] 一志愿武理085500机械专业总分300求调剂 +3 an10101 2026-03-24 7/350 2026-03-25 00:00 by 山鬼0-
[考研] 300分,材料,求调剂,英一数二 +5 超赞的 2026-03-24 5/250 2026-03-24 21:07 by 星空星月
信息提示
请填处理意见