python - Python For 循环的替代方案以获得更快的结果

标签 python mysql for-loop

这是我的情况。我正在尝试建立一个庞大的数据库,其中包含纽约证券交易所和纳斯达克股票及其指标的所有历史数据(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"]

有什么办法可以让它更快吗?您可以建议什么快速方法吗?如果你遇到这种情况你会怎么做?

最佳答案

这花费了很长时间,因为您正在为 4000 多只股票中的每一只运行查询(数据库调用)。

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

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

这种权衡是好的,因为这个繁重的查询只会被调用一次(相对于以当前实现方式执行的约 4000 个查询)。

一般来说,减少对数据库的调用(并在每次调用中带来更多数据)比相反的方式更好,因为每次调用的开销很大。

关于python - Python For 循环的替代方案以获得更快的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56929698/

相关文章:

java - 将远程 tomcat/mySQL 服务器带到本地主机 Mac

mysql - 如何将数据库更改部署到实时服务器?

php - 警告 : mysql_fetch_array(): supplied argument is not a valid MySQL Result in line 40

java - libGDX:如何从数组中删除特定值

java - 在链表数组中找到最长的链表

javascript - 使用 for 循环 JavaScript 打印范围

python 无法打开和编辑 .reg 文件

python - 用单行列表字符串有效地替换多行列表字符串

python - 当窗口大小调整时,Kivy recycleview 项目会重新排序

python - Beautiful Soup - 打印容器文本而不打印子元素的文本