为了账号安全,请及时绑定邮箱和手机立即绑定

更好地查询为 CSV 文件的每一行迭代 API 请求?

更好地查询为 CSV 文件的每一行迭代 API 请求?

慕桂英3389331 2021-07-27 16:53:23
我在问是否有比我更好的 python 查询,它可以允许更好的处理时间。我正在为 CSV 文件的每一行迭代 REST API 请求,并将结果导出到新的 CSV 文件中。当我跑 10 行时,大约需要 11 秒。但我需要做 50,000 行。所以我猜这大约需要 14 小时(833 分钟 = 50,000 秒)。有什么办法可以减少处理时间吗?(任何查询改进?)谢谢!注意:此 API 可以通过输入个人地址、名字、姓氏等来确定个人地址是否是最新的。Python查询import requestsimport jsonimport pandas as pdimport numpy as npimport csv# Input CSVdf = pd.read_csv(r"C:\users\testu\documents\travis_50000.csv",delimiter = ',' , na_values="nan")   # Writing first, last name columnsplitted = df['prop_yr_owner_name'].str.split()df['last_name'] = splitted.str[0]df['first_name'] = splitted.str[1]print(df["first_name"].iloc[0])# Output CSVwith open(r"C:\users\testu\documents\travis_output.csv", 'w',  newline='') as fp:    # Writing Header    fieldnames = ["AddressExtras","AddressLine1","AddressLine2","BaseMelissaAddressKey","City","CityAbbreviation","MelissaAddressKey","MoveEffectiveDate","MoveTypeCode","PostalCode","State","StateName","NameFirst", "NameFull", "NameLast", "NameMiddle", "NamePrefix", "NameSuffix"]    writer = csv.DictWriter(fp, fieldnames=fieldnames)    writer.writeheader()# Iterating requests for each rowfor row in df.itertuples():    url = 'https://smartmover.melissadata.net/v3/WEB/SmartMover/doSmartMover'     payload = {'t': '1353', 'id': '4t8hsfh8fj3jf', 'jobid': '1', 'act': 'NCOA, CCOA', 'cols': 'TotalRecords,AddressExtras,AddressLine1,AddressLine2,,BaseMelissaAddressKey,City,CityAbbreviation,MelissaAddressKey,MoveEffectiveDate,MoveTypeCode,PostalCode,RecordID,Results,State,StateName, NameFirst, NameFull, NameLast, NameMiddle, NamePrefix, NameSuffix', 'opt': 'ProcessingType: Standard', 'List': 'test', 'first': row.first_name, 'last': row.last_name, 'a1': row.prop_year_addr_line1, 'a2': row.prop_year_addr_line2, 'city': row.prop_addr_city, 'state': row.prop_addr_state, 'postal': row.prop_addr_zip, 'ctry': 'USA'}    response = requests.get(        url, params=payload,        headers={'Content-Type': 'application/json'}    )    r = response.json()    print(r)
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

主要有两个性能陷阱:

  1. 对每一行发出一个请求。

  2. 每次打开文件以追加信息。

关于第一点

这是一个猜测,但您可能会启动许多 HTTP 请求。改进该部分的一种方法是在更大的请求中对它们进行批处理(理想情况下是单个请求)。通过这种方式,您可以避免与 PC 和服务器之间的连接设置相关的大量开销。我不知道该 url 是否允许请求批处理,但如果您计划请求 50,000 行(猜测您计划在该循环内启动所有请求),您绝对应该研究它。

关于第二点

你可以尝试这样的事情:

with open(r"C:\users\testu\documents\travis_output.csv", 'a', newline='') as fp:            

    csv_writer = csv.writer(fp)

    # Iterating requests for each row

    for row in df.itertuples():

        # Request info and manipulate its response

        # ... code ...

        # Finally, append the data to file

        csv_writer.writerow(output_list)

第二个提示的主要原因是因为打开文件是一项耗时的操作。因此,您应该尝试打开该文件一次并多次写入。


请注意,我还没有运行此代码,因为我还没有获得该数据的任何样本。所以,这只是关于提高性能的常见方法的提示


查看完整回答
反对 回复 2021-08-03
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信