python 2.7中有async for的等价表达方式吗?

在使用tornado的过程中发现了请求阻塞,用IOLoop.current().set_blocking_log_threshold(0.5)查看了下,是在如下dict comprehension处阻塞了

data = [dict({"sid": sid}, **{key: value for key, value in i.iteritems() if key in need_cols}) for i in v_data]

逻辑拆一下,大概如下

data = []
for i in v_data:  # v_data是个较大的dict
    temp = {key: value for key, value in i.iteritems() if key in need_cols}  # 部分key不需要
    temp["sid"] = sid  # 单独加一个sid
    data.append(temp)

请问这里应该如何改成异步的?

阅读 5.4k
2 个回答

改成异步也没多大用处,你这里是计算密集型,你的费时应该在 "key in need_cols", need_cols应该也是一个很大的数组,想办法优化这块就好。
试试改成这样

ind = set(i.keys()) & set(need_cols)
temp = {d: i[d] for d in ind}

自问自答

改成生成器就好了

def data_generator(*args):
    for i in v_data:  # v_data是个较大的dict
        temp = {key: value for key, value in i.iteritems() if key in need_cols}  # 部分key不需要
        temp["sid"] = sid  # 单独加一个sid
        yield temp
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题