基于Sqlite3的Python股票价格数据库运行缓慢问题优化咨询
嘿,我来帮你拆解下这个股票数据库创建耗时过长的问题~
一、先揪出数据获取环节的瓶颈
从你的代码看,你用了googlefinance.client这个库拉取25年的日线数据,但这个库其实已经停止维护了,而且Google Finance的公开接口本身有访问限流机制,拉取大跨度数据很容易出现请求缓慢甚至超时的情况。
你可以先单独测下数据获取的耗时,确认是不是这一步拖慢了整体速度:
import time start = time.time() param = {'q':'MMM', 'i':"86400",'x':"NYSE",'p':"25Y"} end_of_day = pd.DataFrame(get_price_data(param)) print(f"数据获取耗时:{time.time() - start}秒")
如果这一步占了90%以上的时间,那建议换成维护更活跃、速度更快的数据源,比如yfinance(替代原来的Yahoo Finance接口,现在还在更新),拉取数据的效率会提升很多:
import yfinance as yf # 拉取MMM过去25年的日线数据 df = yf.download("MMM", period="25y", interval="1d")
二、数据库写入的优化(最容易被忽略的提速点)
从你的代码片段看,你还没写完写入数据库的逻辑,但如果是用逐行插入+频繁提交的方式,那速度肯定慢到离谱,尤其是几千条数据的情况:
错误的低效写法(别这么干!)
for index, row in end_of_day.iterrows(): c.execute("INSERT INTO prices VALUES (?, ?, ?, ?, ?)", (row['Open'], row['High'], row['Low'], row['Close'], row['Volume'])) db.commit() # 每插一条就提交,频繁IO交互
正确的优化姿势
- 用pandas的
to_sql()批量写入:这是最省心的方式,自带批量优化,记得加method='multi'参数把多条记录打包成一个SQL语句:# 假设你的表名叫stock_prices,index=True把日期索引也写入 end_of_day.to_sql('stock_prices', db, if_exists='append', index=True, method='multi') - 手动批量提交事务:如果要自己写SQL执行,先开启事务,批量插入后再一次性提交,减少数据库IO次数:
# 把DataFrame转成元组列表 data_tuples = list(end_of_day.itertuples(index=True, name=None)) # 开启事务 db.execute("BEGIN TRANSACTION") try: # executemany批量插入 c.executemany("INSERT INTO stock_prices (date, open, high, low, close, volume) VALUES (?, ?, ?, ?, ?, ?)", data_tuples) db.commit() except Exception as e: db.rollback() # 出错回滚 raise e - 调整sqlite的同步模式:sqlite默认的
synchronous=FULL会严格保证数据安全,但批量写入时可以改成NORMAL或OFF来提速(适合一次性导入数据的场景):db.execute("PRAGMA synchronous = NORMAL")
三、代码里可能藏着的小问题
- 你代码里的
end_o...应该是没写完,要注意DataFrame的列名和数据库表的列名必须对应,不然to_sql()会报错或者插入空值,额外增加处理耗时。 - 如果后续需要频繁查询数据,建议先插入完所有数据再建索引,边插边建索引会大幅拖慢写入速度。
内容的提问来源于stack exchange,提问作者vicky113
相关产品推荐
相关产品推荐

