Python 用于下载数据的并行化循环
我是Python新手。我想在GoogleAppEngine中运行一个简单的脚本,它可以尽快将许多文件检索到一个对象中。并行化会是一个明智的选择吗?我该如何做呢?提前感谢您的头脑风暴Python 用于下载数据的并行化循环,python,Python,我是Python新手。我想在GoogleAppEngine中运行一个简单的脚本,它可以尽快将许多文件检索到一个对象中。并行化会是一个明智的选择吗?我该如何做呢?提前感谢您的头脑风暴 import requests ... theData=[] for q in range(0, len(theURLs)): r = requests.get(theURLs[q]) theData.insert(q,r.text) 您应该通过使用列表理解使代码更具python风格: # A
import requests
...
theData=[]
for q in range(0, len(theURLs)):
r = requests.get(theURLs[q])
theData.insert(q,r.text)
您应该通过使用列表理解使代码更具python风格:
# A list of tuples
theData = [(q,requests.get(theURLs[q]).text) for q in range(0, len(theURLs))]
# ... or ...
# A list of lists
theData = [[q,requests.get(theURLs[q]).text] for q in range(0, len(theURLs))]
如果您想同时使用线程
库检索文件,本网站提供了一些很好的示例,可能是一种很好的做法:
我对此表示严重怀疑。并行化实际上只能加快计算速度,而这里的瓶颈是数据传输。在“常规”Python中,这非常简单
from multiprocessing.pool import ThreadPool
import requests
responses = ThreadPool(10).map(requests.get, urls)
将10替换为能为您产生最佳结果的#个线程
但是,您指定了GAE,该GAE对生成线程/进程及其自身的异步方法有限制,该方法包括使用来自的异步函数,具体如下(未测试):
您需要添加错误处理…整个过程只需一行,这就是优雅!它是否可以不使用q作为第一个参数,比如:
theData=[q,requests.get(theURLs[q])。q的文本范围(0,len(theURLs))]
?否则我会出错哦,对不起,我错过了右括号(对于元组)或方括号(对于列表),请参见编辑,现在应该可以了。这取决于你想对数据做什么,元组是不可变的,列表不是。我强烈建议你在这个网页上学习Python,并快速编写Python代码,前提是你之前对其他语言有一定的了解(有很多关于元组和列表的好信息,等等):在不需要列表索引的地方避免使用列表索引也更具python风格,例如,[(url,requests.get(url.text)for url in url]
@JasonS是的,这是一个很好的观点,但是我认为他想使用整数索引作为元组或列表的第一对,这就是为什么我保持基于范围的for循环。
rpcs = [urlfetch.create_rpc() for url in urls]
for (rpc, url) in zip(rpcs, urls):
urlfetch.make_fetch_call(rpc, url)
results = [rpc.get_result() for rpc in rpcs]