2016-06-20 14 views
7

मुझे लगता है कि json रिटर्न फ्लास्क में एक API लिख रहा हूँ। प्रत्येक फ्लास्क समारोह, प्रपत्रफ्लास्क की जेसनिफ़ाई विधि धीमी क्यों है?

from flask import jsonify 
@app.route('/getdata') 
def get_data(): 
    data = load_data_as_dict() 
    return jsonify(data) 

का है, तो मैं डेटा की एक बड़ी राशि लौटने के इस समारोह के लिए एक कॉल के आसपास 1.7 सेकंड लेता है। हालांकि, अगर मैं ऐसा करते हैं:

from flask import Response 
@app.route('/getdata') 
def get_data(): 
    data = load_data_as_dict() 
    data_as_str = json.dumps(data) 
    return Response(response=data_as_str, status=200, mimetype="application/json" 

... समारोह के आसपास .05 सेकंड में पूरा करता है।

किसी को भी मुझे बता सकते हैं क्यों jsonify तो बहुत धीमी है? क्या इसके बजाय कच्चे फ्लास्क प्रतिक्रिया को वापस करने में कुछ गड़बड़ है?

धन्यवाद!

+0

[json.dumps बनाम flask.jsonify] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/7907596/json-dumps-vs-flask-jsonify) – rnevius

+0

धन्यवाद, मैंने उस पोस्ट को देखा और अंतर को समझ लिया। मेरा सवाल प्रदर्शन के बारे में है। –

उत्तर

5

मेरा अनुमान है: यह खरोज और एक pretty json डंप बनाने के साथ क्या करना एक बहुत है।

def jsonify(*args, **kwargs): 
    indent = None 
    separators = (',', ':') 

    if current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] and not request.is_xhr: 
     indent = 2 
     separators = (', ', ': ') 

    if args and kwargs: 
     raise TypeError('jsonify() behavior undefined when passed both args and kwargs') 
    elif len(args) == 1: # single args are passed directly to dumps() 
     data = args[0] 
    else: 
     data = args or kwargs 

    return current_app.response_class(
     (dumps(data, indent=indent, separators=separators), '\n'), 
     mimetype=current_app.config['JSONIFY_MIMETYPE'] 
    ) 

dumps wraps simplejson.dumps अगर मॉड्यूल उपलब्ध है, अन्यथा यह json.dumps का उपयोग करता है: यहाँ विधि परिभाषा (मैं स्थान बचाने के लिए टिप्पणियाँ छीन, पूर्ण कोड here पाया जा सकता है) है।

यदि आप एक ही तर्क के साथ अपने कोड चलाने आप क्या प्रदर्शन मिलता है?

+0

यह सच है, मैंने कोशिश की। यदि आप jsonify को फिर से परिभाषित करते हैं और jsut इंडेंट को हटाते हैं, तो यह तेज़ी से काम करेगा। मेरे परीक्षण समय में 17 से 0.1 के बीच, 170 बार बदल गया! – Rugnar

0

documentation से यह कहा गया है कि:

इस समारोह लपेटता डंप() में कुछ संवर्द्धन कि जीवन को आसान बनाने के जोड़ने के लिए। यह आवेदन/json माइम प्रकार के साथ एक रिस्पांस वस्तु में JSON उत्पादन बदल जाता है।

तो यह एक ही बात, आप दोनों ही मामलों में एक प्रतिक्रिया वस्तु के साथ खत्म करता है लेकिन क्योंकि यह एक सुविधा समारोह है की तुलना में यह हल्के समकक्ष, इसलिए अतिरिक्त समय आ गया है यह शायद अधिक काम करता है।

संपादित करें: एकल तर्क:

स्पष्टता के लिए, JSON क्रमबद्धता व्यवहार डंप() से निम्नलिखित मतभेद है: वास्तव में डॉक्स पर फिर से देखने के बाद डंप करने के लिए सीधे के माध्यम से पारित()।

क्या आप return jsonify(data) और return json.dumps(data) दोनों का परीक्षण कर सकते हैं? उन्हें मिलना चाहिए।

संबंधित मुद्दे