【问题标题】:Speed up Python Loop append加速 Python 循环追加
【发布时间】:2018-01-10 20:50:02
【问题描述】:

您好,我有一个巨大的值列表,我想找到所有 n 值模式,例如 list[0:30]、list[1:31]。并将每个值与第一个值比较百分比,例如 percent_change(array[0],array[1]), percent_change(array[0],array[2]),一直到模式结束。 在此之后,我想将所有 30 个值模式存储在一个模式数组中,以便将来与其他值进行比较。

为此,我必须构建一个函数: 对于此功能,可以通过更改变量 numberOfEntries 将 30 个值更改为我的任何选择 对于每个模式,我计算 10 个下一个结果的平均值,并将其存储在具有相同索引的结果数组中

#end point is the end of array
#inputs (array, numberOfEntries)
#outPut(list of Patterns, list of outcomes)

y=0
condition= numberOfEntries+1
#each pattern list
pattern=[]
#list of patterns
Patterns=[] 
#outcomes array
outcomes=[]



while (y<len(array)):
    i=1
    while(i<condition):

        #this is percentage change function, I have built it inside to gain speed. Try is used because possibility of 0 division
        try:
            x = ((float(array[y-(numberOfEntries-i)])-array[y-numberOfEntries])/abs(array[y-numberOfEntries]))*100.00
            if x == 0.0:
                x=0.000000001
        except:
            x= 0.00000001
        i+=1
        pattern.append(x)
 #here is the outcomes
     outcomeRange = array[y+5:y+15]
     outcome.append(outcomeRange)
     Patterns.append(pattern)
     #clean pattern array
     pattern=[]
     y+=1

对一个 8559 值数组执行此操作,这对于我占用的 229.6792 的数据量来说很小。

有没有办法让它适应多线程或提高这个速度?

编辑:

为了更好地解释,我有这个 ohlc 数据:

                     open      high       low     close      volume
TimeStamp                                                            
2016-08-20 15:50:00  0.003008  0.003008  0.002995  0.003000    6.351215
2016-08-20 15:55:00  0.003000  0.003008  0.003000  0.003008    6.692174
2016-08-20 16:00:00  0.003008  0.003009  0.002996  0.003001   10.813029
2016-08-20 16:05:00  0.003001  0.003000  0.002991  0.002991    4.368509
2016-08-20 16:10:00  0.002991  0.002993  0.002989  0.002990    6.662944
2016-08-20 16:15:00  0.002990  0.003015  0.002989  0.003015    8.495640

我把它提取为

array=df['close'].values

然后我将这个数组应用到函数中,它会为这个特定的值集返回一个充满这样的列表的列表,

[0.26, 0.03, -0.03, -0.04, ,0.005]

这是从每一行到样本开始的百分比变化,这就是我所说的模式。我可以选择有多少条目可以有一个模式。

希望我现在更清楚...

【问题讨论】:

  • 多线程是死胡同,不要追求。潜在的多处理,但理想的方法是循环矢量化。
  • 因此,我想将其标记为 numpy,但看起来您只是在使用 python 列表(尽管说您有 np 数组)?
  • 实际上此时我没有使用 numpy,只是使用 pandas 而不是返回一个列表。 @roganjosh 如何使用循环矢量化?
  • 那么问题就很混乱了。您可以在您的系列中使用滚动窗口,将其保存在 pandas 中。您的示例应该代表您正在尝试做的事情,但猜测一下,您不想将这些数据作为 python 列表提取出来。
  • “返回列表的熊猫”,你的意思是熊猫系列吗?如果是这样,它的行为与 numpy 数组非常相似

标签: python arrays multithreading performance data-analysis


【解决方案1】:

首先,我会将while 循环转换为for 循环,因为i 现在递增得更快。

for i in range(1,condition):

现在,由于y 不会在您的内部循环中更改,您可以从以下方面优化您的计算:

x = ((float(array[y-(numberOfEntries-i)])-array[y-numberOfEntries])/abs(close[y-numberOfEntries]))*100.00

到:

x = (float(array[y-(numberOfEntries-i)])-array[y-numberOfEntries]) * z

zwhile/for 循环之前之前被预先计算为:

    z = 100.00 / abs(close[y-numberOfEntries])

为什么?

  • 首先,z 是预先计算的,因此不会计算 abs 和访问 close 数组
  • 其次,z 是要除的值的倒数,所以可以乘以它。乘法比除法快得多。
  • 第三:不再除以零是可能的,因为你不再除。 zerodiv 可以出现在循环外的z 上,必须进行相应的处理(将整个 z + 循环的东西包裹在try/except 中,并将结果设置为x= 0.00000001,当它发生时,它应该是等效的)

所以你的内部循环可能是:

try:
    z = 100.00 / abs(close[y-numberOfEntries])
    for i in range(1,condition):
        x = (float(array[y-(numberOfEntries-i)])-array[y-numberOfEntries]) * z
except ZeroDivisionError:
    x = 0.00000001
pattern.append(x)

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 2017-08-24
    • 2016-02-18
    • 2021-01-30
    • 2017-01-28
    • 2014-11-19
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多