我有一个2001 - 2017年的分钟级货币价格数据的大文件。我想创建一个简单的最近邻居实现,以查看5分钟前,25分钟前和50分钟前的%价格变化是否有任何解释力(我确定它赢了但是它只是用于学习)。我创建' dif_X'的方式。列表正在设置一个非常长的时间(如5小时)。我对python非常陌生,甚至不知道在哪里想出这个,但我知道有一种方法可以让它在python中运行得更快。这是代码:
import numpy as np
import pandas as pd
def findNNDistances(df_):
samp = df_[10]
count = 0
df_['dist'] = [None]*len(df_)
while count < len(df_):
print("Count: " + str(count))
df_['dist'] = np.sqrt((samp['dif_5'] - df_['dif_5'][count])**2 +
(samp['dif_25'] - df_['dif_25'][count])**2 +
(samp['dif_50'] - df_['dif_50'][count])**2)
df = pd.read_csv("Downloads/AUDUSD/AUDUSD.txt") # this is a csv
df['dif_5'] = [None]*len(df)
df['dif_25'] = [None]*len(df)
df['dif_50'] = [None]*len(df)
df['index'] = [None]*len(df)
count = 99
while count < len(df) - 1:
print("countA: " + str(count))
df['dif_5'][count] = (df['close'][count] - df['close'][count - 5])/df['close'][count-5]
df['dif_25'][count] = (df['close'][count] - df['close'][count - 25])/df['close'][count-25]
df['dif_50'][count] = (df['close'][count] - df['close'][count - 50])/df['close'][count-50]
df['index'][count] = count - 99
count += 1
half_size = int(np.round(len(df)/2))
train = df[99:half_size] # not used yet
test = df[half_size + 1: len(df) - 1] # not used yet
df.apply(findNNDistances)
print(df['dist'].head(20))
如何让这次跑得更快? 我也很欣赏在python中使这样的事情运行得更快的一般提示。 感谢。
答案 0 :(得分:0)
让我试着给你一些提示,什么可以工作〜 与用C或C ++这样的快速语言编写的代码相比,用Python编写的任何东西都会很慢。
但有趣的是,其他人用Python编写的命令实际上通常用更快(“编译”)的语言编写,比如C ++。
当您的计算机正在操作数据(定义变量,运行回归等)时,它实际上正在做的是从存储中获取一些数据,将其移至处理器,使用它进行数学运算,然后将其重新放入存储
为了简化,我们可以将您的计算机视为具有两种存储形式 - RAM(有时称为主存储器)和硬盘驱动器。但这两种形式的记忆非常非常不同。您的计算机可以从RAM中获取数据的速度提高100,000倍,从而可以获取硬盘上的数据。因此,当您的计算机能够将您正在使用的所有数据保存在RAM中时,您的计算机会更快乐(并且执行速度更快)。实际上,如果你将数据来回移动到你的硬盘上,那几乎肯定是最大的瓶颈 - 与在现代计算机上来回移动数据相比,进行实际计算几乎是即时的。
您可以详细了解如何知道您的计算机是否在浪费时间来回硬盘here.
您是否尝试过使用带有熊猫的numba \?我知道您的目标,但您应该看it并查看here
老实说,我远离大数据处理,只有CV和ML \ DP,但有时使用这样的仪器。
你可以尝试谷歌关于Cython(使免费的Python花费时间检查每个变量的类型)和Parallelizetion。我不知道最后2种方式,数据科学使用它,何时需要加速代码。
很抱歉很多文字,这就是我读到的关于它的知识〜希望为你找到美好的一天〜