繁体   English   中英

如何提高代码 python 的性能?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM