【问题标题】:Sum squared difference for a list pairs with over 1.5 million items包含超过 150 万个项目的列表对的平方和差
【发布时间】:2023-03-19 10:32:01
【问题描述】:

我看到了这个问题:Sum of Square Differences (SSD) in numpy/scipy

但是,我想知道。我的机器有 16 核和 64GB RAM。在 python 中迭代超过一百万个项目的列表以首先获取价格,然后计算 1 个交易年的平方和差异并将所有结果保存回数据框中,非常耗时和耗能。我可以使用多处理来加速这个过程吗?


def SSD(list_of_tickers):
    start = time.time()
    ssd_results = pd.DataFrame(columns=['stock1', 'stock2', 'corr', 'ssd'])
    for i in range(len(list_of_tickers)):
        price1 = price_pipeline.loc['2015-01-01':'2016-01-01', list_of_tickers[i][0]]
        price2 = price_pipeline.loc['2015-01-01':'2016-01-01', list_of_tickers[i][1]]
        ssd = np.sum((price1 - price2)**2)
        ssd_results.loc[i, 'ssd'] = ssd
        ssd_results.loc[i, 'stock1'] = list_of_tickers[i][0]
        ssd_results.loc[i, 'stock2'] = list_of_tickers[i][1]
        ssd_results.loc[i, 'corr'] = list_of_tickers[i][2]

    print('finished running in: {}'.format(time.time() - start))
    return ssd_results

这些变化感谢评论部分与尼克的讨论显着提高了速度(810 秒):


def SSD(list_of_tickers):
    start = time.time()
    ssd_results = pd.DataFrame(columns=['stock1', 'stock2', 'corr', 'ssd'])
    list_ssd = []
    list_corr = []
    list_stock1 = []
    list_stock2 = []
    new_pipe = price_pipeline.loc['2015-01-01':'2016-01-01']
    for i in range(len(list_of_tickers)):
        price1 = new_pipe[list_of_tickers[i][0]]
        price2 = new_pipe[list_of_tickers[i][1]]
        ssd = np.sum((price1 - price2)**2)

        list_ssd.append(ssd)
        list_corr.append(list_of_tickers[i][2])
        list_stock1.append(list_of_tickers[i][0])
        list_stock2.append(list_of_tickers[i][1])

    print('finished running in: {}'.format(time.time() - start))
    ssd_results['stock1'] = list_stock1
    ssd_results['stock2'] = list_stock2
    ssd_results['ssd'] = list_ssd
    ssd_results['corr'] = list_corr
    
    return ssd_results

【问题讨论】:

  • 您的计算机每秒运行超过 10 亿条指令,因此计算一百万个条目的平方差之和大约需要一毫秒。在这种大小下,您的程序将花费更多时间在多处理开销上,而不是实际进行计算。似乎不值得打扰,除非你是为了学习目的。
  • 这是怎么发生的?那么有没有办法加快这个过程呢?我想做教育目的。
  • 迭代列表很快。创建结果的 new 列表(或其他数据结构),这将需要相当多的内存分配,是缓慢的部分。
  • 我怀疑其中一部分是.loc。那就是在数据帧上反复进行切片操作,我认为您可以在循环之前进行。
  • 如果我们知道您的数据是什么样子会很好...

标签: python pandas


【解决方案1】:

您不应该尝试重新发明轮子。相反,通过使用numpy 来使用矢量化计算。它在对向量进行计算时效果很好,这里是数据框的列。

【讨论】:

  • 是的,它确实提高了速度。
猜你喜欢
  • 2021-01-08
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
相关资源
最近更新 更多