Itertools可加速美丽汤中的嵌套循环

2024-10-06 07:42:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这是用Python3编写的代码,可以正常工作。但是用四个嵌套循环和更多的内部循环运行它的速度非常慢

如何实现itertools以加快循环速度

对于包含4列数据的25行,这大约需要20秒

import bs4 as bs
import urllib.request
import time

start_time = time.time()

a=[]
b=[]
c=[]
d=[]

for z in range(1,10):
    source = urllib.request.urlopen(f'https://X.com/id={z}').read()
    soup = bs.BeautifulSoup(source,'html.parser')

    for i in range(0,50):
        for name in soup.find_all('span',id=f"tblRightHolders:{i}:cellRHSurnameName"):
            a.insert(i,name.string)
        for city in soup.find_all('span',id=f"tblRightHolders:{i}:cellRHPlace"):
            b.insert(i,city.string)
        for street in soup.find_all('span', id=f"tblRightHolders:{i}:cellRHStreet"):
            c.insert(i,street.string)
        for number in soup.find_all('span', id=f"tblRightHolders:{i}:cellRHNumber"):
            d.insert(i,number.string)
    
X = [list(e) for e in zip(a, b, c, d)]
for nested in X:
    print(" - ".join(map(str, nested)))

print("--- %s seconds ---" % (time.time() - start_time))

数据的输出如下所示:

Name/Surname - City - Street - Street number


Tags: 数据inimportidnumberforstringtime
1条回答
网友
1楼 · 发布于 2024-10-06 07:42:08

我不认为itertools会加快它的速度-它们可以为更可读的代码提供更好的方法。如果要加快速度,有几个选项:

  1. 使用joblib进行并行化
  2. 尝试使用一些即时编译器,比如numba,但是要做到这一点,您可能必须重写代码,因为soup代码不太可能与numba兼容
  3. 用C/C++、rust或cython重写关键代码

最后两个很可能是杀伤力过大。如果可以的话,使用joblib进行简单的并行处理(即,有多个内核可用)。Itertools不会帮助您加快速度,它们只会让您的代码变得更好

[编辑] 我确实建议先对代码计时。如果您的代码大部分时间用于下载页面,那么您可以使用joblib,但使用线程而不是进程。我今天刚刚做了一些类似的事情,有100个单独的网页请求线程

相关问题 更多 >