[英]how to Improve The performance of code python?
目前在我的代码中,我正在下载 pdf(1 页有 10 个 pdf),它大约有 900 页,所以 9000 pdf 目前我正在使用threading
,它需要 1400 pdf 在 1 小时内帮助改进我的代码
import requests
from bs4 import BeautifulSoup as bs
from concurrent.futures import ThreadPoolExecutor
def writepdf(k, v):
path = r"C:\Users\deepak jain\Desktop\spectra"
with requests.Session() as session:
with open(f'{path}/{k}.pdf', 'wb') as f:
with session.get(v, stream=True) as r:
for data in r.iter_content():
f.write(data)
def main():
with requests.Session() as s:
current_page = 1
end_number = 900
threads = []
with ThreadPoolExecutor() as executor:
while current_page <= end_number:
r = s.get(f'https://bidplus.gem.gov.in/bidlists?bidlists&page_no={current_page}')
r.raise_for_status()
soup = bs(r.content, 'lxml')
for i in soup.select('.bid_no > a'):
k = i.text.strip().replace('/', '_')
v = f'https://bidplus.gem.gov.in{i["href"]}'
threads.append(executor.submit(writepdf, k, v))
if current_page == 1:
num_pages = int(soup.select_one('.pagination li:last-of-type > a')['data-ci-pagination-page'])
end_number = min(end_number, num_pages)
current_page += 1
for t in threads:
t.result()
if __name__ == '__main__':
main()
IIUC,您有许多页面包含指向 pdf 文件的链接。 您的主线程解析页面,并且一些或工作线程下载 pdf 文件。
您使用看起来合理的 ThreadPoolExecutor。
乍一看可能的改进:
for t in threads
循环在主循环内)。 除非你有充分的理由,否则你应该只在主循环结束时等待(即将for t in threads
循环移到主循环之外)ThreadPoolExecutor
中的默认线程数。 从 Internet 下载文件时,由 HTTP 协议引起的延迟可能会很高,我会尝试明确给出该线程数并将其调整为最佳值。 默认值为 5 * 处理器数量,通常仅以 5 结束。您可以尝试值 5、10、15 和 20(最终更多...),看看是否有改进。 请注意,某些站点可能会将来自同一源地址的大量并行下载视为攻击,因此请准备好面对具有高值的连接错误。 如果发生这种情况,请稍等片刻,然后用较低的值重试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.