【问题标题】:Optimizing append() in for loops优化 for 循环中的 append()
【发布时间】:2020-12-22 20:16:51
【问题描述】:

我有一个处理超过 900 万个组合的 for 循环(为此,我使用了 itertools 库),必须更快地执行下面的代码,循环所有组合花费的时间太长。感谢任何建议

wb = xw.books('FX VEGA BT.xlsm')
sht = wb.sheets['Sheet1']
#retrieving data from excel
df = pd.DataFrame(sht.range('PY_PNL').value, columns=['10','20','25','40','50','60','70','75','80','90'])

#df has shape of 3115 rows × 10 columns

def sharpe(x):
    s = round(np.average(x)/np.std(x)*np.sqrt(252),2)
    return s

shrps = []
outlist = []

mult = (-1,-2.5,0,1,2.5)

perm = itertools.product(mult,repeat = 10)
for p in perm:
    c = df*p
    c = c.sum(axis='columns')
    outlist.append(p)
    shrps.append(sharpe(c))

【问题讨论】:

  • perform...better? - 更好的方法? df 是什么? - 请阅读minimal reproducible example、amd How to Ask 以及该页面上的其他链接。
  • 感谢您的建议,二战。做了一些改动,觉得更清楚了
  • 我不知道您从哪里得到list.append 是您需要优化的想法,但事实并非如此。它占用的运行时间可以忽略不计。
  • 再说一次,如果没有最小数据示例 (df),我们该如何提供帮助?您的 mre 不应包含对我们无法访问或某些非现场资源的数据的引用。我们应该能够将您的问题复制并粘贴到我们的编辑器中。 - How to make good reproducible pandas examples
  • 对于原始追加速度来说,双端队列比列表快(参见here

标签: python pandas performance loops


【解决方案1】:

您可以使用列表推导式,它会更快一点:

shrps = [sharpe((df*p).sum(axis='columns')) for p in perms]

如果您确实需要名为outlistperm 副本,可以使用copy 包中的deepcopy

import copy

outlist = copy.deepcopy(perm)

为了进一步加快这个过程,你可以在sharpe()函数中改变一些东西(我不知道它是什么样子的)。

【讨论】:

  • 实际上我需要找到每个锐化与哪个组合相关,我只是没有找到比每次循环都将组合附加到同一个数据帧更好的方法
  • 所以,我只能建议列表理解来加快速度。祝你好运!
猜你喜欢
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2012-12-23
  • 2017-09-20
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多