为什么Julia在解码GZIP和解析JSON时很慢?
下面这个脚本是逐行读取gzip文件,并解码成JSON对象。
Pkg.add("GZip")
Pkg.add("JSON")
using GZip
using JSON
stream = GZip.gzopen(Base.ARGS[1])
_started = time()
i = 0
for line in eachline(stream)
_j = JSON.parse(line)
if i % 10000 == 0
println(time()-_started)
end
i += 1
try
key_id = _j["some_id"]
except
pass
end
end
输出结果:
0.7071459293365479
20.09155511856079
37.8870849609375
和Python相比:
import os
import sys
import gzip
import datetime
import ujson as json
_started = datetime.datetime.now()
fh = gzip.open(sys.argv[1])
for i, line in enumerate(fh):
if i % 10000 == 0:
print datetime.datetime.now() - _started
line = json.loads(line)
try:
k = line['some_id']
except:
pass
输出结果:
0:00:00.028951
0:00:01.934277
0:00:03.821954
0:00:05.713572
是的,我知道我用了ujson,它确实很快——但是难道Julia不应该更快吗?结果却慢得多 =(
附言:我试了很多次,所以这和操作系统的缓存什么的没有关系。
再附言:Mac OS 10.7.3,Julia 0.2.1
2 个回答
2
试着把你的计算放在一个函数里。全局变量是一个已知的性能陷阱:
http://docs.julialang.org/en/release-0.2/manual/performance-tips/
5
把JSON和GZIP操作分开处理是个不错的建议。我猜(只是猜测!)大部分时间都花在了JSON解析上;ujson确实很快。不过,没有办法保证一种语言中的所有操作都是快的。比如,PyPy通常能让Python代码运行得更快,但在某些情况下,它仍然可能比较慢,或者比C扩展还慢。