【问题标题】:Alternative to Python For Loop for faster results替代 Python For 循环以获得更快的结果
【发布时间】:2019-07-08 23:07:45
【问题描述】:

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

所有 4000 多只股票都存储在一个名为“ALLSTOCKS”的表中。该表每天使用我的 csv 上传更新。

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

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

我提到股票总共有 4000+ 对吗?因此,我决定将平均公式包含在 FOR LOOP 中。

这是我的一些代码:

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"]

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

【问题讨论】:

  • 是否可以假设每个代码的处理不依赖于任何其他票据的处理结果?即这些可以并行完成吗?
  • 您可以使用 SQL 方法解决此问题:按股票代码分组,而不是对每个股票代码的值进行一次查询
  • 我不确定我是否做对了,但我想开始。您是否将数据读取为 pandas DataFrame?因为有一种使用 pandas 获取列的更快方法,给定一组值用作您想要获取的列的“标准”。
  • @Joe No. 我没有使用熊猫。

标签: python mysql for-loop


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 不想按库存分组吗?
  • @josoler 这是一个例子,我不知道这里的业务逻辑是如何工作的,这绝对不是问题的重点,也不是答案。
  • 我可能遗漏了一些东西,但您的查询不会返回单个值吗?如果是这样,它确实与答案相关,因为人们应该期望输出具有与 for 循环中一样多的值。
  • 好吧,那我误解了你的问题。我认为它会平均所有股票的收盘价,这可能会产生误导。谢谢!
  • 嘿@alfasin,谢谢你的回答。我会在一天之内调查此事。再次感谢,祝您有美好的一天。 :)
猜你喜欢
  • 1970-01-01
  • 2020-11-14
  • 2018-10-03
  • 1970-01-01
  • 2021-07-20
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多