2016-10-04 4 views
1

디스크의 CSV (x, y 좌표)를 읽고 웹 프런트 엔드에서 렌더링 할 수 있도록 JSON 형식으로 출력하는 API를 작성하고 싶습니다. 문제는 많은 데이터 포인트 (30k의 순서)가 있으므로 x와 y의 numpy 배열에서 JSON으로 이동하는 것이 실제로 느리다는 것입니다.Python에서 JSON을 만드는보다 효율적인 방법

이것은 JSON 형식의 데이터를 가져 오는 현재 함수입니다. 이 속도를 높이는 방법이 있습니까? 각 2 차원 포인트에 대해 큰 데이터 구조를 갖는 것은 매우 불필요한 것처럼 보입니다.

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

이 unnessacary 변수의 사용을 제거하고 청소기 : 같은

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

웹 프런트 엔드는 어떻게 렌더링됩니까? Dicts는 다소 부피가 크지 만 json.dumps ([xdata.tolist(), ydata.tolist()]) 두 개의 목록을 전달할 수 있습니다. 플롯이 어쨌든 두리스트를 원할 가능성이 있습니다. – tdelaney

+0

nvd3을 사용하고 있습니다. 내가 지원하는 대체 데이터 형식에 대한 정보는 찾을 수 없지만 그렇게하면 많은 일이 훨씬 쉬워 질 것입니다. http://stackoverflow.com/questions/23643487/json-data-format-in-nvd3-chart – Nate

+0

클라이언트 자바 스크립트 측면에서 목록을 변환 할 수 있다고 생각합니다. 일부 데이터 페이로드는 저장하지만 스트리밍 미디어 세계에서는 가치가 없을 수도 있습니다. (만약 nvd3가 dict와 괜찮 으면 어쩌면 전문가들이라고 생각할 수있을 것입니다!) – tdelaney

답변

1

당신은 지능형리스트를 사용할 수 있습니다. 또한 사용할 수 있습니다

발전기 좋아 :

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

Generators는 기본적으로 생성되기를 기다리는 객체이며, 슈퍼 라이트이며 매우 많은 양의 데이터를 처리 할 때 훌륭하다. 나는 그것을 읽도록 조언한다 - 나는 전문가가 아니다. –

+0

첫 번째 기능은 정상적으로 작동합니다. JSON 유형 응답을 생성 할 수있는 저수준 서버를 사용하지 않는 한, 재사용은 어쨌든 문자열로 보내질 것입니다. –

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 
관련 문제