星期三, 十月 04, 2006

从微尘《一个Python程序的6次改进》想到的

一个Python程序的6次改进 在 http://blog.csdn.net/tinydust 贴出

下面是总结出来的最快的python实现
import datetime

if __name__ == "__main__":
    t1=datetime.datetime.today()
    f = file("email.txt","r")
    f2 = file("email_new.txt","w")
    f2.writelines(set(f))
    f.close()
    f2.close()
    t2=datetime.datetime.today()
    print str(t2-t1)

在我机器上的测试结果:
python 2.5:  0:00:00.172000
这个程序语言特性用到了极致, 近乎完美地解决了问题,佩服!

一位网友的ruby实现
#!/usr/bin/env ruby
t = Time.new

file = 'email.txt'

f1= File.new('email.txt', 'r')
data = f1.readlines
f1.close

f2 = File.new('email_rb.txt', 'w')
f2.write(data.uniq.join)
f2.close
puts Time.new - t

ruby 2.0.0 (Base: Ruby 1.9.0 2006-04-08) [i386-mswin32]
YARVCore 0.4.1 Rev: 545 (2006-09-01) [opts: [inline method cache] ]

这个程序也很酷,结果  0.391

看了之后,马上产生了用lua写一个同样程序的想法!

lines = {}

f1 = io.open ("email.txt","r")
for line in f1:lines() do lines[line] = true end
f1:close()

f2 = io.open ("e_t.txt","w+")
for line in pairs(lines) do f2:write(line, "\n") end
f2:close()
print(os.clock())

Lua 5.1.1 Copyright (C) 1994-2006 Lua.org, PUC-Rio: 0.406
测试结果: Python:Ruby:Lua = 172:391:406

是不是LUA就差了呢!才不是呢!

这也是可以理解的, LUA io操作肯定是没有优化的,没有一次将所有的数据读入/写出,我尝试一次读入出数据,然后对读入的数据按照string的方式来处理,然后一次写盘,测试的结果是比上面的程序慢了一倍,问题在于lua对于字符串的操作同样也为优化,花的时间很长,CPU/内存开销都很大,看来又比要对字符处处理做一个扩展库.
另外将上面的程序两个循环合并成一个同时操作读入/写出文件后性能也不理想,因为同时在两个文件上进行IO操作,硬盘磁头会频繁移动,性能反而降低。LUA的优势要嵌入C/C++才能表现出来!

不过python的表现让我惊奇, rite的表现也很惹人注意。

由于我的开发工作决定使用lua会更好。所以我会继续使用lua.

iolanguage也进入了我的视线,抽空也的研究一下!

1 条评论:

杨城 说...

您好,修改了一下您的lua程序,在测试用30K和60K的文本文件测试后速度是相同的。
f1 = io.open("test.txt", "r")
f2 = io.open("test1.txt", "w")
for line in f1:lines() do
f2:write(line, "\n")
end
f2:close()
f1:close()
print(os.clock())
和您的程序区别就在于没有建立Table。
杨城 gump.yang@gmail.com