【发布时间】: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。那就是在数据帧上反复进行切片操作,我认为您可以在循环之前进行。 -
如果我们知道您的数据是什么样子会很好...