为什么Julia在解码GZIP和解析JSON时很慢?

2 投票
2 回答
1216 浏览
提问于 2025-04-18 03:07

下面这个脚本是逐行读取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扩展还慢。

撰写回答