日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python加速循环嵌套的方法_如何加速python嵌套循环?

發布時間:2024/9/15 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python加速循环嵌套的方法_如何加速python嵌套循环? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

更新:(幾乎)完全矢量化版本在下面的“新功能2”。。。

我會加上一些評論來解釋一下。

它提供大約50倍的加速,如果輸出是numpy數組而不是列表,則可能會有更大的加速。原樣:In [86]: %timeit new_function2(close, volume, INTERVAL_LENGTH)

1 loops, best of 3: 1.15 s per loop

您可以用對np.cumsum()的調用替換內部循環。。。請參閱下面的“new_function”函數。這給了一個相當大的加速。。。In [61]: %timeit new_function(close, volume, INTERVAL_LENGTH)

1 loops, best of 3: 15.7 s per loop

對In [62]: %timeit old_function(close, volume, INTERVAL_LENGTH)

1 loops, best of 3: 53.1 s per loop

它應該是可能的矢量化整個事情和避免完全為循環,盡管。。。給我一分鐘,我看看我能做什么。。。import numpy as np

ARRAY_LENGTH = 500000

INTERVAL_LENGTH = 15

close = np.arange(ARRAY_LENGTH, dtype=np.float)

volume = np.arange(ARRAY_LENGTH, dtype=np.float)

def old_function(close, volume, INTERVAL_LENGTH):

results = []

for i in xrange(len(close) - INTERVAL_LENGTH):

for j in xrange(i+1, i+INTERVAL_LENGTH):

ret = close[j] / close[i]

vol = sum( volume[i+1:j+1] )

if (ret > 1.0001) and (ret < 1.5) and (vol > 100):

results.append( (i, j, ret, vol) )

return results

def new_function(close, volume, INTERVAL_LENGTH):

results = []

for i in xrange(close.size - INTERVAL_LENGTH):

vol = volume[i+1:i+INTERVAL_LENGTH].cumsum()

ret = close[i+1:i+INTERVAL_LENGTH] / close[i]

filter = (ret > 1.0001) & (ret < 1.5) & (vol > 100)

j = np.arange(i+1, i+INTERVAL_LENGTH)[filter]

tmp_results = zip(j.size * [i], j, ret[filter], vol[filter])

results.extend(tmp_results)

return results

def new_function2(close, volume, INTERVAL_LENGTH):

vol, ret = [], []

I, J = [], []

for k in xrange(1, INTERVAL_LENGTH):

start = k

end = volume.size - INTERVAL_LENGTH + k

vol.append(volume[start:end])

ret.append(close[start:end])

J.append(np.arange(start, end))

I.append(np.arange(volume.size - INTERVAL_LENGTH))

vol = np.vstack(vol)

ret = np.vstack(ret)

J = np.vstack(J)

I = np.vstack(I)

vol = vol.cumsum(axis=0)

ret = ret / close[:-INTERVAL_LENGTH]

filter = (ret > 1.0001) & (ret < 1.5) & (vol > 100)

vol = vol[filter]

ret = ret[filter]

I = I[filter]

J = J[filter]

output = zip(I.flat,J.flat,ret.flat,vol.flat)

return output

results = old_function(close, volume, INTERVAL_LENGTH)

results2 = new_function(close, volume, INTERVAL_LENGTH)

results3 = new_function(close, volume, INTERVAL_LENGTH)

# Using sets to compare, as the output

# is in a different order than the original function

print set(results) == set(results2)

print set(results) == set(results3)

總結

以上是生活随笔為你收集整理的python加速循环嵌套的方法_如何加速python嵌套循环?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。