我的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"])])