Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有人知道我如何让代码运行得更快吗?_Python_Performance_Python Requests - Fatal编程技术网

Python 有人知道我如何让代码运行得更快吗?

Python 有人知道我如何让代码运行得更快吗?,python,performance,python-requests,Python,Performance,Python Requests,我已经完成了一个网络刮板,将通过Roblox,并挑选出在Roblox上创建的前1000个帐户的所有用户名。幸运的是,它起作用了!然而,也有不利的一面 我的问题是,这段代码需要绝对的时间才能完成。是否有人知道一种更有效的方法来编写同样的东西,或者这只是Python请求的基本速度?代码如下:) 附:代码只花了5分钟就通过了600个帐户 def find_account(id): import requests from bs4 import BeautifulSoup r

我已经完成了一个网络刮板,将通过Roblox,并挑选出在Roblox上创建的前1000个帐户的所有用户名。幸运的是,它起作用了!然而,也有不利的一面

我的问题是,这段代码需要绝对的时间才能完成。是否有人知道一种更有效的方法来编写同样的东西,或者这只是Python请求的基本速度?代码如下:)

附:代码只花了5分钟就通过了600个帐户

def find_account(id):
    import requests
    from bs4 import BeautifulSoup

    r = requests.request(url=f'https://web.roblox.com/users/{id}/profile', method='get')
    if r.status_code == 200:
        soup = BeautifulSoup(r.text, 'html.parser')
        stuff = soup.find_all('h2')
        special = stuff[0]
        special = list(special)
        special = special[0]
        return str(special) + '      ID: {}'.format(id)
    else:
        return None

users = []
for i in range(10000,11000):
    users.append(find_account(i))
    print(f'{i-9999} out of 1000 done')
 #There is more below this, but that is just the GUI and stuff. This is the part that gets the usernames.

尝试异步库以异步方式尝试执行相同的操作。使用异步python的优点是,在调用下一个http调用之前,不需要等待一个http调用完成。这是一篇关于如何用python编写并发/并行代码的精彩文章,如果这里的语法令人困惑,请阅读

重构为在异步模式下运行:

导入异步IO
进口aiohttp
从bs4导入BeautifulSoup
异步def find_帐户(id,会话):
与session.get异步(f'https://web.roblox.com/users/{id}/profile')作为r:
如果r.status==200:
响应\u text=wait r.read()
soup=BeautifulSoup(响应文本'html.parser')
stuff=汤。查找所有('h2'))
特殊=材料[0]
特殊=列表(特殊)
特殊=特殊[0]
打印(完成1000个字符中的f'{id-9999}')
返回str(特殊)+'ID:{}'。格式(ID)
其他:
一无所获
异步定义爬网url id范围(最小id、最大id):
任务=[]
与aiohttp.ClientSession()作为会话异步:
对于范围内的id(最小id、最大id):
tasks.append(asyncio.sure_future(find_account(id=id,session=session)))
return wait asyncio.gather(*任务)
event\u loop=asyncio.get\u event\u loop()
用户=事件\循环。运行\直到\完成(爬网\ url \ id \范围(最小\ id=10000,最大\ id=11000))

我进行了测试,上面的代码运行得相当好。

除了代码,可能是internet连接吗?我建议使用多处理,以便同时启动多个批处理,然后在最后收集所有结果。您研究过使用它了吗?这很可能会从并行化中受益匪浅。无论是多处理还是异步IO库,这里都有一篇很棒的文章,展示了每种方法的用例,根据您的python版本,可能会有不同的语法。有时您可以执行
run()
,而不是收集事件循环并运行直到完成,有时您可以使用
create_task()
而不是
sure_future()