2011-05-05 95 views
5

我從Avro的文件中使用的Avro圖書館閱讀一些數據。從文件中加載33K個對象需要大約一分鐘的時間。這對我來說似乎很慢,特別是在約1秒內讀取相同文件的Java版本。avro的Python執行速度慢嗎?

下面是代碼,我做錯了什麼?

import avro.datafile 
import avro.io 
from time import time 

def load(filename): 
    fo = open(filename, "rb") 
    reader = avro.datafile.DataFileReader(fo, avro.io.DatumReader()) 
    for i, record in enumerate(reader): 
     pass 

    return i + 1 

def main(argv=None): 
    import sys 
    from argparse import ArgumentParser 

    argv = argv or sys.argv 

    parser = ArgumentParser(description="Read avro file") 


    start = time() 
    num_records = load("events.avro") 
    end = time() 

    print("{0} records in {1} seconds".format(num_records, end - start)) 

if __name__ == "__main__": 
    main() 
+0

您的代碼不會執行任何操作。如果有與速度有關的速度問題。 – 2011-05-05 21:24:06

+0

'負載()'應該叫'fo.close()'返回之前,而不是把文件打開。雖然這可能不是減速的原因。 – Velociraptors 2011-05-05 21:26:29

+0

如果你想知道爲什麼它很慢,學習如何使用探查器。 – 2011-05-05 21:28:46

回答

3

avro Python package提供PyPI上是純Python,所以我並不感到驚訝,如果它是由magniture或以上的訂單比Java更慢。

有一個Avro的C實現的,但據我所知,還沒有人創建了一個基於它Python擴展。

+0

不幸的是,我的文件上的avro c實現segfaults。 – lazy1 2011-05-06 03:14:56

+0

@ lazy1無賴。你是否被迫使用Avro格式,並且考慮過替代品? – samplebias 2011-05-06 03:27:50

+0

另一種選擇是CSV,它在Python中速度非常快(33K行爲0.2)。然而,CSV不像avro那樣攜帶模式。我*可能*能夠使用CSV標題,但由於其他人正在生產(通過豬),我不能100%確定這是可能的。 – lazy1 2011-05-06 03:34:45

1

這似乎在叫fastavro一個Python包,是一種快速的用Cython實現,但更小的特徵,完整。

https://bitbucket.org/tebeka/fastavro

+7

我知道,我寫的:) – lazy1 2012-11-21 00:47:55

+0

笑...哎呀... :) – 2012-12-14 20:17:21