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

我在问是否有比我更好的 python 查询,它可以允许更好的处理时间。我正在为 CSV 文件的每一行迭代 REST API 请求,并将结果导出到新的 CSV 文件中。当我跑 10 行时,大约需要 11 秒。但我需要做 50,000 行。所以我猜这大约需要 14 小时(833 分钟 = 50,000 秒)。


有什么办法可以减少处理时间吗?(任何查询改进?)谢谢!


注意:此 API 可以通过输入个人地址、名字、姓氏等来确定个人地址是否是最新的。


Python查询

import requests

import json

import pandas as pd

import numpy as np

import csv


# Input CSV

df = pd.read_csv(r"C:\users\testu\documents\travis_50000.csv",delimiter = ',' , na_values="nan")

   # Writing first, last name column

splitted = 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 CSV

with 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 row

for 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)

慕桂英3389331
浏览 125回答 2
2回答

慕容708150

主要有两个性能陷阱:对每一行发出一个请求。每次打开文件以追加信息。关于第一点这是一个猜测,但您可能会启动许多 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)第二个提示的主要原因是因为打开文件是一项耗时的操作。因此,您应该尝试打开该文件一次并多次写入。请注意,我还没有运行此代码,因为我还没有获得该数据的任何样本。所以,这只是关于提高性能的常见方法的提示
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python