[英]What is the best way to optimize this for loop for speed? (pandas, BS objects.)
我有一个 pandas 数据帧/系列,每行都有一个 URL 来创建一个美丽的汤 object 并从中刮取数据。 但是,循环非常慢,运行我当前的循环需要很多小时才能完成,因为有超过 21,000 行。 这可以通过 apply 或 numpy 进行优化吗?
count = 0
url = data['review_link']
for link in url:
url = "http://{}".format(link)
req = requests.get(url)
best = BeautifulSoup(req.text, 'html')
reviews = best.find_all('div', {'class' : 'review-detail'})
for review in reviews:
entry = {
'artist' : safeFindText(review, 'ul', {'class' : 'artist-links artist-list single-album-tombstone__artist-links'}),
'bnm' : safeFindText(review, 'p', {'class' : 'bnm-txt'}),
'title' : safeFindText(review, 'h1', {'class' : 'single-album-tombstone__review-title'}),
'score' : safeFindText(review, 'span', {'class' : 'score'}),
'label' : safeFindText(review, 'li', {'class' : 'labels-list__item'}),
'year' : safeFindText(review, 'span', {'class' : 'single-album-tombstone__meta-year'}),
'author' : safeFindText(review, 'a', {'class' : 'authors-detail__display-name'}),
'author_title' : safeFindText(review, 'span', {'class' : 'authors-detail__title'}),
'genre' : safeFindText(review, 'a', {'class' : 'genre-list__link'}),
'review_timestamp' : safeFindText(review, 'time', {'class' : 'pub-date'}),
'review_abstract' : safeFindText(review, 'div', {'class' : 'review-detail__abstract'}),
'review_text' : safeFindText(review,'div', {'class' : 'clearfix flex-md'})
}
pitchfork_dicts.append(entry)
if count % 10 == 0:
print("{} rows completed".format(count))
count += 1
问题是您的程序在请求等待响应时处于空闲状态。 由于等待网络 IO 可能是瓶颈,我不认为 apply 或 numpy 会给你很大的速度。 我能想到的两个优化是使用一个 ThreadPool 来处理所有请求,而你的主循环遍历它的列表。 或者使用 async 异步发出请求,以便在等待响应时,您可以继续处理列表。
对于线程池,您可以创建一个主线程推送到的线程安全队列。 然后是一个线程池,它会弹出下一个项目并发出请求并处理结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.