该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-06
嗯!楼主肯专研比较值得敬佩!讨论妙处生花堪为精彩!精华贴!
|
|
返回顶楼 | |
发表时间:2009-05-06
lz的代码比较乱,不过我以前也对比过,比lz的场景简单: input = open("in.txt","r") output = open("out","w") line = input.readline() while line: info=line.split(":") output.write(info[1]+"\t"+info[2]+"\n") line = input.readline() input.close() output.close()
input = open("in.txt","r") output = open("out.txt","w") while line = input.gets info=line.split(/:/) output.write(info[1]+"\t"+info[2]+"\n") end input.close output.close 处理了一个6G的话单,最后Python大概5分钟,Ruby半个小时。 |
|
返回顶楼 | |
发表时间:2009-05-06
[quote="conservatism"]
lz的代码比较乱,不过我以前也对比过,比lz的场景简单: [code="python"]input = open("in.txt","r") output = open("out","w") line = input.readline() while line: info=line.split(":") output.write(info[1]+"\t"+info[2]+"\n") line = input.readline() input.close() output.close() [code="ruby"]input = open("in.txt","r") output = open("out.txt","w") while line = input.gets info=line.split(/:/) output.write(info[1]+"\t"+info[2]+"\n") end input.close output.close 处理了一个6G的话单,最后Python大概5分钟,Ruby半个小时。 其实您这个代码还是可以优化的…… 用sed试试,花多长时间? sed -i 's/:/\t/' 文件名 |
|
返回顶楼 | |
发表时间:2009-05-07
wosmvp 写道 [quote="conservatism"]
lz的代码比较乱,不过我以前也对比过,比lz的场景简单: [code="python"]input = open("in.txt","r") output = open("out","w") line = input.readline() while line: info=line.split(":") output.write(info[1]+"\t"+info[2]+"\n") line = input.readline() input.close() output.close() [code="ruby"]input = open("in.txt","r") output = open("out.txt","w") while line = input.gets info=line.split(/:/) output.write(info[1]+"\t"+info[2]+"\n") end input.close output.close 处理了一个6G的话单,最后Python大概5分钟,Ruby半个小时。 其实您这个代码还是可以优化的…… 用sed试试,花多长时间? sed -i 's/:/\t/' 文件名 把c都拿出来了比了,再下去拿汇编拿机器码优化了。楼主只是表达同样是python和ruby的初学者,python写的程序相对快些。 |
|
返回顶楼 | |
发表时间:2009-05-07
cx6445 写道 把c都拿出来了比了,再下去拿汇编拿机器码优化了。楼主只是表达同样是python和ruby的初学者,python写的程序相对快些。 ,我想表述的是 做“不同的事情”有“不同的最佳工具” …… |
|
返回顶楼 | |
发表时间:2009-05-08
LZ,抛开ruby不谈,以下python代码是否符合原来的逻辑呢?
print "正在读取等待状态报告的记录..." with open(waitstatusfile) as f: for line in f: if (len(line) < 23): continue arrline = line.split(",") if "3" in arrline: fwdsendwaitstatus[arrline[1].strip('\r\n')]=line if "4" in arrline: fwdrecvwaitstatus[arrline[6].strip('\r\n')]=line print "开始状态报告的比较与分类..." with open(statusdatafile) as f: for line in f: if (len(line) < 23): continue arrline = line.split(",") key = arrline[0].strip('\r\n') if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)): fwdsendresult.append("DELIVRD" + "," + fwdsendwaitstatus[key]) del fwdsendwaitstatus[key] if ( (key in fwdrecvwaitstatus.keys()) & ("DELIVRD" in arrline)): fwdrecvresult.append("DELIVRD" + "," + fwdrecvwaitstatus[key]) del fwdrecvwaitstatus[key] print "结束状态报告的比较与分类" |
|
返回顶楼 | |
发表时间:2009-05-08
最后修改:2009-05-08
neomac.lin 写道 LZ,抛开ruby不谈,以下python代码是否符合原来的逻辑呢?
print "正在读取等待状态报告的记录..." with open(waitstatusfile) as f: for line in f: if (len(line) < 23): continue arrline = line.split(",") if "3" in arrline: fwdsendwaitstatus[arrline[1].strip('\r\n')]=line if "4" in arrline: fwdrecvwaitstatus[arrline[6].strip('\r\n')]=line print "开始状态报告的比较与分类..." with open(statusdatafile) as f: for line in f: if (len(line) < 23): continue arrline = line.split(",") key = arrline[0].strip('\r\n') if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)): fwdsendresult.append("DELIVRD" + "," + fwdsendwaitstatus[key]) del fwdsendwaitstatus[key] if ( (key in fwdrecvwaitstatus.keys()) & ("DELIVRD" in arrline)): fwdrecvresult.append("DELIVRD" + "," + fwdrecvwaitstatus[key]) del fwdrecvwaitstatus[key] print "结束状态报告的比较与分类" 本来不想就这些其他看法再进行讨论说明了,因为讨论这些不是我发这个帖子的本意,不过先说几句,晚些有空再来进行个最后总结,谢谢大家的参与了 首先 if "3" in arrline: 这句是有问题的,因为我要判断的是第一个字段,也就是arrline列表的第一个是3才行,然而你的这行代码是只要其中有个元素等于3就可以了,虽然模拟数据中没有出现其他字段会有3了,执行正确,但你这行代码起码逻辑是不够完善的,没有严格根据需要完成对数据的判断 然后 if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)): 每行文件数据的处理中都执行这句代码在操作大数据量哈希表时是有非常大的性能问题的,而且还执行了2次,不知道你执行过没有,虽然看出你的问题了,但我还是实际执行过,确认确实很有性能问题才发上来指出的,希望指明后你能看出来,呵... |
|
返回顶楼 | |
发表时间:2009-05-08
..................
|
|
返回顶楼 | |
发表时间:2009-05-08
最后修改:2009-05-08
xukong 写道 neomac.lin 写道 LZ,抛开ruby不谈,以下python代码是否符合原来的逻辑呢?
print "正在读取等待状态报告的记录..." with open(waitstatusfile) as f: for line in f: if (len(line) < 23): continue arrline = line.split(",") if "3" in arrline: fwdsendwaitstatus[arrline[1].strip('\r\n')]=line if "4" in arrline: fwdrecvwaitstatus[arrline[6].strip('\r\n')]=line print "开始状态报告的比较与分类..." with open(statusdatafile) as f: for line in f: if (len(line) < 23): continue arrline = line.split(",") key = arrline[0].strip('\r\n') if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)): fwdsendresult.append("DELIVRD" + "," + fwdsendwaitstatus[key]) del fwdsendwaitstatus[key] if ( (key in fwdrecvwaitstatus.keys()) & ("DELIVRD" in arrline)): fwdrecvresult.append("DELIVRD" + "," + fwdrecvwaitstatus[key]) del fwdrecvwaitstatus[key] print "结束状态报告的比较与分类" 本来不想就这些其他看法再进行讨论说明了,因为讨论这些不是我发这个帖子的本意,不过先说几句,晚些有空再来进行个最后总结,谢谢大家的参与了 首先 if "3" in arrline: 这句是有问题的,因为我要判断的是第一个字段,也就是arrline列表的第一个是3才行,然而你的这行代码是只要其中有个元素等于3就可以了,虽然模拟数据中没有出现其他字段会有3了,执行正确,但你这行代码起码逻辑是不够完善的,没有严格根据需要完成对数据的判断 然后 if ( (key in fwdsendwaitstatus.keys()) & ("DELIVRD" in arrline)): 每行文件数据的处理中都执行这句代码在操作大数据量哈希表时是有非常大的性能问题的,而且还执行了2次,不知道你执行过没有,虽然看出你的问题了,但我还是实际执行过,确认确实很有性能问题才发上来指出的,希望指明后你能看出来,呵... 了解,看来有时候可读性和具体需求真是鱼与熊掌啊,学习了。 |
|
返回顶楼 | |
发表时间:2009-05-09
neomac.lin 写道 了解,看来有时候可读性和具体需求真是鱼与熊掌啊,学习了。
那么,如果读不出具体需求,可读什么? |
|
返回顶楼 | |