Python拉取数据时如何限制返回小数位数?yahoo_fin股票数据场景示例
问题分析与优化方案
你对性能瓶颈的判断有误,64位浮点数的传输和计算开销极小,不会导致程序运行缓慢。真正的性能瓶颈是你在循环中逐次向雅虎金融接口发起近500次独立HTTP请求,每次请求都需要等待网络响应,串行执行的总耗时自然很高。仅在本地截断2位小数不会减少接口返回的数据量,无法解决速度慢的问题。
优化方案
- 优先使用批量查询接口:雅虎金融本身支持同时查询多只股票的实时价格,你可以替换
get_live_price为批量查询逻辑,一次请求拉取所有标普500成分股的价格,从根源上减少HTTP请求次数,这是效率最高的优化方式。 - 采用多线程并发请求:如果要继续使用yahoo_fin的现有接口,可以用线程池并发发起请求,利用网络IO等待的空闲时间同时处理多个查询请求,总耗时会大幅下降。优化后的参考代码如下:
from yahoo_fin import stock_info as si from concurrent.futures import ThreadPoolExecutor # 最大线程数可根据自身网络情况调整,一般10-20即可 MAX_WORKERS = 15 spy = si.tickers_sp500() result = [] def check_price(ticker): try: price = si.get_live_price(ticker) # 本地截断为2位小数 if round(price, 2) < 50.00: return ticker except Exception: # 跳过请求失败的标的 return None with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: for ticker in executor.map(check_price, spy): if ticker: result.append(ticker) print(result)
- 增加异常捕获逻辑:原代码没有处理接口请求失败的情况,部分标的查询报错会直接终止程序,补充异常捕获可以保证脚本稳定运行。
内容的提问来源于stack exchange,提问作者pyhelpwork
相关产品推荐
相关产品推荐

