Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python For循环的替代方案,可获得更快的结果_Python_Mysql_For Loop - Fatal编程技术网

Python For循环的替代方案,可获得更快的结果

Python For循环的替代方案,可获得更快的结果,python,mysql,for-loop,Python,Mysql,For Loop,这是我的情况。我正试图建立一个庞大的数据库,其中包含纽约证交所和纳斯达克股票及其指标2017年1月1日至2019年6月30日的所有历史数据 所有4000+个库存存储在一个名为“ALLSTOCKS”的表中。此表每天使用我的csv上载更新 csv下载包含每个股票的开盘价、高点、低点和收盘价,这些信息将从各自的列中存储。根据这些数字,我的python代码将自动执行计算。这些计算的一个很好的例子是得到9、20、50和100天收盘平均数 为了做到这一点,我提取每个股票的最后9天、20天、50天收盘价,并执

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


一般来说,对数据库的调用越少,每次调用带来的数据越多,性能越好,因为每次调用的开销都很大。

假设每个ticker的处理不依赖于任何其他ticket的处理结果,安全吗?i、 这些可以并行完成吗?你可以用SQL方法来解决这个问题:按股票代码分组,而不是对每个股票代码的价值进行一次查询。我不确定我是否正确,但首先我想用asl。您正在以数据帧的形式读取数据吗?因为使用panda可以更快地获取列,给定一组值作为您只想获取的列的“标准”。@Joe否。我没有使用panda。您不想按库存分组吗?@josoler这是一个示例,我不知道这里的业务逻辑是如何工作的,这肯定不是问题的重点,也不是答案。我可能遗漏了一些东西,但您的查询不会返回一个值吗?如果是这样的话,它确实与答案有关,因为人们应该期望输出的值与for循环中的值一样多。我认为这将平均所有股票的收盘价,这可能会产生误导。谢谢嘿@alfasin,谢谢你的回答。我会在一天内调查此事。再次感谢您,祝您度过愉快的一天