可替代Python For Loop以获得更快的结果

2024-09-30 14:33:05 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的情况。我正试图建立一个庞大的数据库,包含纽约证交所和纳斯达克股票及其指标的所有历史数据(2017年1月1日至2019年6月30日)。你知道吗

所有4000+个股票都存储在一个名为“ALLSTOCKS”的表中。此表每天使用我的csv上载更新。你知道吗

csv下载包含每个股票的开盘、高点、低点和收盘点,这些股票将从各自的列中存储。根据这些数字,我的python代码将自动执行计算。这些计算的一个很好的例子是得到9日、20日、50日和100日收盘平均数。你知道吗

为此,我提取每个股票的最后9天、20天、50天和收盘价,并执行一个简单的mysql AVG()函数,将其存储到“ALLSTOCK”数据库中的指定列(MA9)。你知道吗

我说过股票总共有4000多美元,对吗?因此,我决定将平均公式封装在FOR循环中。你知道吗

以下是我的一些代码:

for ticker in tickers:

mycursor.execute("SELECT format(AVG(Close),4) from (select Close from _PSEI where stock = '" + ticker + "' ORDER BY ID DESC LIMIT 0,9) _PSEI")
manine = mycursor.fetchone()[0]

mycursor.execute("SELECT format(AVG(Close),4) from (select Close from _PSEI where stock = '" + ticker + "' ORDER BY ID DESC LIMIT 0,20) _PSEI")
matwenty = mycursor.fetchone()[0]

不管怎样,问题是因为这是一个for循环,其变量数组包含4000多个项。我的成绩很慢。也就是说,我的代码每只股票执行大约0.3到0.5秒,完成整个循环最多需要2000秒。你知道吗

以下是变量数组的一部分:

ticker = ["CHK","BAC","GE","VALE","T","F","PFE","GGB","ECA","SWN","BBD","GME","RRC","FCX","AUY","AVP","APC","KGC","PBR","WFC","S","NBR","DB","C","SAN","KO","PG","RIG","HAL","MRK","X","NOK","APA","DNR","JPM","NLY","MRO","GFI","VZ","RF","XOM","NEM","NKE","HPQ","MS","CLF","DAL","SLB","M","ESV","V","KR","CTL","KEY","JCP","OXY","DIS","BP","CIG","EOG","IAG","MO","GM","RIO","EQT","GOL","HMY","ABB","DVN","MGM"]

有没有办法让它快点?你有什么建议吗?如果你遇到这种情况,你会怎么做?你知道吗


Tags: csv代码from数据库forcloseexecute情况
1条回答
网友
1楼 · 发布于 2024-09-30 14:33:05

这需要很长时间,因为您正在为4000多只股票中的每一只运行一个查询(DB call)。你知道吗

我会尝试运行一个检查所有股票的查询,例如:

mycursor.execute("SELECT ... where stock in ('CHK', 'GE', 'BAC', ...) ...")

这种折衷是很好的,因为这一个繁重的查询只会被调用一次(相对于目前执行的大约4000个查询)。你知道吗

一般来说,对数据库进行较少的调用(并在每次调用中带来更多的数据)比反之更好,因为每次调用的开销都很大。你知道吗

相关问题 更多 >