烧瓶循环需要很长时间才能完成



我的app.py中有这个循环。由于某种原因,它将加载时间延长了3秒以上。有什么解决方案吗?

import dateutil.parser as dp
# Converts date from ISO-8601 string to formatted string and returns it
def dateConvert(date):
return dp.parse(date).strftime("%H:%M @ %e/%b/%y")
def nameFromID(userID):
if userID is None:
return 'Unknown'
else:
response = requests.get("https://example2.org/" + str(userID), headers=headers)
return response.json()['firstName'] + ' ' + response.json()['lastName']
logs = []
response = requests.get("https://example.org", headers=headers)
for response in response.json():
logs.append([nameFromID(response['member']), dateConvert(response['createdAt'])])

它将加载时间延长了3秒以上,因为它做了很多不必要的工作,这就是为什么。

  • 您没有使用requests会话。每个请求都需要创建和拆除HTTPS连接。太慢了
  • 您正在为每个名称转换执行另一个HTTPS请求。(见上文。(
    • 您要对该函数中得到的JSON进行两次解析
  • 不管dp.parse()是什么(dateutil?(,它可能要从一个自由格式的字符串中进行大量额外的解析工作。如果您知道输入格式,请使用strptime

这里有一个返工应该会更快。当然,请先看一下TODO要点。

此外,如果您可以自由地了解成员id->名称映射不会改变,您也可以将name_cache作为一个适当命名的全局变量(但请记住,它可能会在请求之间持久化(。

import datetime
import requests
INPUT_DATE_FORMAT = "TODO_FILL_ME_IN"  # TODO: FILL ME IN.

def dateConvert(date: str):
return datetime.datetime.strptime(date, INPUT_DATE_FORMAT).strftime(
"%H:%M @ %e/%b/%y"
)

def nameFromID(sess: requests.Session, userID):
if userID is None:
return "Unknown"
response = sess.get(f"https://example2.org/{userID}")
response.raise_for_status()
data = response.json()
return "{firstName} {lastName}".format_map(data)

def do_thing():
headers = {}  # TODO: fill me in
name_cache = {}
with requests.Session() as sess:
sess.headers.update(headers)
logs = []
response = sess.get("https://example.org")
for response in response.json():
member_id = response["member"]
name = name_cache.get(member_id)
if not name:
name = name_cache[member_id] = nameFromID(sess, member_id)
logs.append([name, dateConvert(response["createdAt"])])