2016-10-04 82 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