python - 加快 Python 循环追加速度

标签 python arrays multithreading performance data-analysis

您好,我有一个巨大的值列表,我想找到所有 n 个值模式,例如 list[0:30]、list[1:31]。并对每个值与第一个值进行百分比比较,例如percentage_change(array[0],array[1])、percentage_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]

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

希望我现在更清楚了......

最佳答案

首先,我会将 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)

关于python - 加快 Python 循环追加速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48195845/

相关文章:

Python Mysql, "commands out of sync; you can' t run this command now"

python - 使用 Python 逐列写入 .txt 文件

python - numpy 数组从另一个数组赋值

javascript - 带有数组javascript的下拉列表选项值和名称

javascript - 将字符串修改为数组

java - 在单核处理器上使用并行流会比使用顺序流慢吗?

python - 如何使用 asyncio Python 3.8+/Windows 10+ 无一异常(exception)地执行 sys.exit()?

multithreading - 在用户级线程中阻塞

c++ - Qt 和 boost 线程本地存储的限制

python - 修复 Python 中的错误?