我通过使用多线程函数来加速进程,但是我需要保持输出和输入之间的关系。
import requests
import pprint
import threading
ticker = ['aapl', 'googl', 'nvda']
url_array = []
for i in ticker:
url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + i + '?formatted=true&crumb=8ldhetOu7RJ&lang=en-US®ion=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com'
url_array.append(url)
def fetch_ev(url):
urlHandler = requests.get(url)
data = urlHandler.json()
ev_single = data['quoteSummary']['result'][0]['defaultKeyStatistics']['enterpriseValue']['raw']
ev_array.append(ev_single) # makes array of enterprise values
threads = [threading.Thread(target=fetch_ev, args=(url,)) for url in
url_array] # calls multi thread that pulls enterprise value
for thread in threads:
thread.start()
for thread in threads:
thread.join()
pprint.pprint(dict(zip(ticker, ev_array)))
代码的示例输出:
1){'aapl': '30.34B', 'googl': '484.66B', 'nvda': '602.66B'}
2){'aapl': '484.66B', 'googl': '30.34B', 'nvda': '602.66B'}
我需要将值与正确的股票代码匹配。
编辑:我知道字典不会保留顺序。对不起,也许我的问题有点(非常)不清楚。我有一系列的股票代码符号,与我的网址输入的顺序相匹配。运行fetch_ev
后,我想将这些股票代码符号与匹配的企业价值或ev_single
结合起来。它们存储的顺序无关紧要,但是配对( k v 对)或哪些值与非常一起存储重要。
Edit2(MCVE)我将代码更改为我所拥有的更简单的版本 - 更好地显示了问题。对不起,它比我想要复杂的要复杂一点。
答案 0 :(得分:1)
为了便于维护输入和输出之间的对应关系,可以预先分配With Sheets("Sheet 1")
.Select
.ListObjects("Table1").ListRows.Add AlwaysInsert:=True
End With
Range("BA10").Select
,使其与ev_array
数组的大小相同,并ticker
thread函数可以给出一个额外的参数,指定该数组中用于存储所获取值的位置的索引。
维护fetch_ev()
的完整性,添加了ev_array
以防止对共享资源的并发访问,否则可能由多个线程同时写入。 (由于其内容现在直接通过传递给threading.RLock
的索引引用,因此这可能不是绝对必要的。)
我不知道正确的股票代码↔企业价值并发,以便能够验证这样做的结果:
fetch_ev()
但至少每次运行时它们都是相同的。
{'aapl': 602658308096L, 'googl': 484659986432L, 'nvda': 30338199552L}