《Ruby/YARV/Python跨平台性能对比测试报告》(附单词频率统计实例)
来源:互联网 发布:jquery数组去重复 编辑:程序博客网 时间:2024/05/16 18:43
Ruby/YARV/Python跨平台性能对比测试报告
作者:Suninny http://blog.csdn.net/rails
问题描述:从一个文件中选出使用频率最多的30个单词
数据来源:http://www.gutenberg.org/dirs/etext03/kpnng10.zip
一、基本测试
Ruby代码:
count = Hash.new(0)
File.read('test.txt').split.each {|word| count[word] += 1 }
p count.to_a.sort_by{|x| x[1]}[-30, 30].reverse
end
if __FILE__ == $0
t1 = Time.now
test
puts t2 = Time.now - t1
end
Python代码:
from operator import itemgetter
def test():
count = {}
for word in open("test.txt").read().split():
if count.has_key(word):
count[word] = count[word] + 1
else:
count[word] = 1
print sorted(count.iteritems( ), key=itemgetter(1), reverse=True)[0:30]
if __name__ == "__main__":
t1 = time()
test()
print time()-t1
都蛮简洁的。由于Ruby支持带默认值的初始化,少了几行代码。
输出结果为:
Ruby1.8.4@Win32耗时:0.641s
Python2.5@Win32耗时:0.310s;启用Psyco:0.249s
Ruby1.8.5@Cygwin:0.558s
Ruby-yarv@Cygwin:0.453s
Python2.5@Cygwin:0.312s;启用Psyco:0.246s
Ruby1.8.5@Ubuntu: 0.434s
Ruby-yarv@Ubuntu: 0.373s
Python2.5@Ubuntu:0.271s; Psyco: 0.196s
更新@2006.09.17, 19:03
刚发现Python也有类似于Ruby“默认值初始化”的特性,于是test()函数可以改为:
count = {}
for word in open("test.txt").read().split(): count[word] = 1 + count.get(word, 0)
print sorted(count.iteritems( ), key=itemgetter(1), reverse=True)[0:30]
二、加测内存占用情况
1、将测试文本扩大10倍,变成 9.5M,前面两个程序的时间和内存消耗分别为(括号中为psyco/yarv的分值):
ruby1.8.4@win32: 5.63,97M
ruby1.8.5@cygwin: 4.77s, 93M(3.84s, 95M)
ruby1.8.5@ubuntu: 3.78s, 91M (3.36s, 91M)
py2.5@win32: 2.51s, 65M(1.85s, 72M)
py2.5@cgwin: 2.58s, 80M(1.94s,110M)
py2.5@ubuntu:2.23s, 63M(1.42s, 63M)
2、因为两者用的都是将文件内容一次性读入数组的方法,所以内存占用量都很大,下面对其进行改进:
Ruby代码:
count = Hash.new(0)
for line in open("test.txt")
for word in line.split
count[word] += 1
end
end
p count.to_a.sort_by{|x| x[1]}[-30, 30].reverse
end
if __FILE__ == $0
t1 = Time.now
test
puts t2 = Time.now - t1
end
Python代码:
from operator import itemgetter
def test():
count = {}
for line in open("test.txt"):
for word in line.split():
count[word] = 1 + count.get(word, 0)
print sorted(count.iteritems(), key=itemgetter(1), reverse=True)[0:30]
if __name__ == "__main__":
t1 = time()
test()
print time()-t1
输出为:
现在两个程序的时间和内存消耗分别为(括号中为psyco/yarv的分值):
ruby1.8.4@win32:7.3s,5M
ruby1.8.5@cygwin: 6.45s, 5M(6.04s, 5M)
ruby1.8.5@ubuntu: 4.25s, 3.2M(4.11s, 3.2M)
py2.5@win32: 2.34s, 3M(1.54s,5M)
py2.5@cygwin: 2.45s, 4M(1.74s, 6M)
py2.5@ubuntu: 2.25s, 1.7M(1.34s,1.8M)
注意:尽管Ruby的内存占用量只有原来的1/20,但速度也明显慢了下来;而Python内存占用一样骤减,速度也随之提升。
更新@2006.09.17, 22:50
这两个程序最后打印结果的那行都还可以稍稍作下改进:
Ruby的可以改为:
Python的可以改用2.5版最新引入的nlargest()函数(新发现的很棒的东东,只是Ruby目前还未包含类似的函数,Ruby1.9也没看到,只有一个max_by):
更新@2006.09.18, 08:25 新增Ubuntu下的分值
Python经过这几年的发展,进步真的很大,不管是在性能还是标准库的扩充方面。而Ruby在这方面却令人有点失望,有时运行速度只及Python的1/3,YARV也形同虚设。值得注意的是两者在Ubuntu下的表现都不错,尤其是Ruby,有显著提升。
- 《Ruby/YARV/Python跨平台性能对比测试报告》(附单词频率统计实例)
- Python 统计文章单词出现频率
- 统计单词频率-map
- Java统计单词频率
- hadoop-python——统计单词出现的频率
- python实现统计文本中单词出现的频率
- 性能测试报告(实例)
- 性能测试报告(实例)
- 性能测试报告实例
- Chrome浏览器性能对比测试报告
- Chrome 浏览器性能对比测试报告
- 统计单词频率(HashMap)
- 作业,统计单词出现频率
- Java统计单词出现频率
- 统计文本中每个单词出现的频率(附C++完整程序)
- 统计出现频率最高的十个单词的程序性能分析
- 跨平台开源项目Ngui【基准性能测试报告】
- Java, Python, Ruby, PHP, C等语言性能对比
- 报表定义文件出现 xmlns="" 造成报表无法解析怎么办?
- 什么是CIS?
- debian/t43安装手记
- 一个基层管理者需要做好的几个方面
- 产品经理的第一堂课(十四):工作的价值
- 《Ruby/YARV/Python跨平台性能对比测试报告》(附单词频率统计实例)
- ACE在AIX上使用
- Linux c 网络socket编程
- sql server 增加 读取binary字段
- 对国内ddos厂商技术点评
- awk的教程
- 开学了
- 【杂文】话说红颜知已
- 爱情老了,就是亲情