2016-10-04 23 views
1

我想編寫一個從磁盤上的CSV(帶有x,y座標)讀取並以JSON格式輸出它們以便由web前端呈現的API。問題是有很多數據點(30k的順序),所以從n和y到y的數組到JSON非常慢。更高效的從Python創建JSON的方法

這是我當前使用JSON格式獲取數據的函數。有什麼辦法可以加快速度嗎?對於每個2d點來說,擁有如此龐大的數據結構似乎非常冗餘。

def to_json(xdata, ydata): 
    data = [] 
    for x, y in zip(xdata, ydata): 
     data.append({"x": x, "y": y}) 
    return data 
+0

Web前端如何呈現?字典有點笨重,但你可以傳遞兩個列表'json.dumps([xdata.tolist(),ydata.tolist()])''。無論如何,情節可能需要兩個列表。 – tdelaney

+0

我正在使用nvd3。我找不到有關它所支持的備用數據格式的任何信息,但是如果這樣做會使事情變得更容易。 http://stackoverflow.com/questions/23643487/json-data-format-in-nvd3-chart – Nate

+0

我想你可以將列表轉換爲客戶端JavaScript一側的字典。您可以節省一些數據有效載荷,但在流媒體世界中,也許這不值得。 (如果nvd3與字典是好的,也許你可以認爲他們是專家!) – tdelaney

回答

1

你可以使用列表理解一樣:

def to_json(xdata, ydata): 
    return [{"x": x, "y": y} for x, y in zip(xdata, ydata)] 

消除使用unnessacary可變的,並且是清潔的。

您也可以使用發電機,如:

def to_json(xdata, ydata): 
    return ({"x": x, "y": y} for x, y in zip(xdata, ydata)) 

他們創造超級快,在系統上輕便,使用幾乎沒有任何記憶。 這是最後一次,直到你做了像轉換成列表。

由於對象僅僅XY座標我會使用帶有XY元組發電機對象 - 這也創造了更快 - 像這樣:

def to_json(xdata, ydata): 
    return ((x,y) for x, y in zip(xdata, ydata)) 

編輯:您可以用列表[]更換元組,他們有效的JSON數組。

+0

最後一個在這種情況下不起作用,數據需要以我使用的特定格式。至於發電機,這是否真的提供了加速?我仍在迭代整個序列 – Nate

+0

發電機基本上是等待創建的對象,它們非常輕,對處理大量數據非常有用,我建議您閱讀它 - 我不是專家。 – 2016-10-04 01:40:02

+0

第一個功能會很好。除非您使用低級別的服務器來構建JSON類型的響應,否則reuslt將以字符串的形式發送。 – 2016-10-04 01:41:15

0

你的方法似乎足夠合理。以下是我可能對其進行的一些更改。 itertools模塊有許多方便的工具,可以讓你的生活更輕鬆。我使用了izip,你可以閱讀here

import json 
from itertools import izip 

def to_json(xdata, ydata): 
    data = [] 
    for x, y in izip(xdata, ydata): # using izip is more memory efficient 
    data.append({"x": x, "y": y}) 
    return json.dumps(data) # convert that list into json