我有一个烧瓶安息的api,对于一个简单的请求,它可能需要5到30秒才能响应。
使用分析器,我看到在jsonify调用中使用了大量时间:
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 24.112 24.112 my_api.py:72(decorated_function)
1 0.000 0.000 24.109 24.109 checkSystem.py:11(decorated_function)
1 0.019 0.019 24.109 24.109 __init__.py:521(decorated_function)
1 0.007 0.007 24.066 24.066 my_api.py:135(get)
1 0.000 0.000 20.960 20.960 json.py:201(jsonify)
1 0.000 0.000 20.960 20.960 json.py:114(dumps)
1 0.024 0.024 20.960 20.960 __init__.py:274(dumps)
1 1.215 1.215 20.936 20.936 encoder.py:248(encode)
2142307/2043811 2.736 0.000 19.689 0.000 encoder.py:600(_iterencode)
7781216/2043811 10.640 0.000 17.306 0.000 encoder.py:513(_iterencode_dict)
2166915/2043795 2.840 0.000 12.561 0.000 encoder.py:424(_iterencode_list)
1 0.109 0.109 3.099 3.099 historyDao.py:4(getHistory)
2142370 1.516 0.000 1.516 0.000 {isinstance}
.......
你可以看到我在DAO中也花了3秒钟,因为我的数据集不是那么小。
我可以看到编码器脚本有很多调用,但我只调用jsonify一次,所以我真的不知道如何减少它。 你知道jsonify如此长久吗?
如果它有帮助,这是一个回应的例子:
{
"stationHistory": {
"features": [
{
"geometry": {
"coordinates": [
45.75118,
4.884795
],
"type": "Point"
},
"id": "3079",
"properties": {
"RGB": "rgb(0,96,160)",
"address": "address",
"banking": 1,
"bikes": 3,
"extra": "\"extra\"",
"free_slots": 13,
"last_update": "1420625383000",
"movable": 0,
"name": "3079 - PLACE LOUISE",
"status": 1,
"tms_gmt": "Wed, 07 Jan 2015 10:15:03 GMT",
"total_slots": 0
},
"type": "Feature"
}
],
"type": "FeatureCollection"
}
}
当然还有更多功能。我没有"递归" json,有很多词典进入其他词典。所以我无法解释通话次数。
我会试着展示一些代码。
我有一个简单的烧瓶安息应用程序,没什么特别的,这是一个示例类:
class Historic(restful.Resource):
@somewrappers
@cache.memoize(60)
def get(self, some_args):
parser = MyParser()
parser.add_argument('arg1', type=int, help="Can't read arg1")
args = parser.parse_args()
historic = historyDao.getHistory(
currentConnection,
some_args,
args.get('arg1', None),
)
return jsonify(historic)
我的dao执行一个sql请求,没问题,并以geojson格式存储结果:
featureList = []
for station in data:
station['RGB'] = utils.getRGB(station, system)
featureList.append(utils.createFeature(station))
featureCollection = utils.createFeatureCollection(featureList)
response_dict = {'stationHistory' : featureCollection}
return response_dict
来自utils模块的函数只是添加额外的geojson东西,"特性:","属性:",你可以在json示例中看到结果