我想加快以下代碼的處理速度
x = [] 。
y = []
z = []
for i in range(0, 1000000)。
if 0 < u[i] < 1920 and 0 < v[i] < 1080:
x.append(u[i])
y.append(v[i])
z.append([x_ind[i], y_ind[i]])
如果有任何想法,我們將非常感激。 謝謝
。uj5u.com熱心網友回復:
通常情況下,你可以通過替換在索引上的回圈和在原始值上的回圈來優化這樣的情況。因此,這里的替換代碼將是:
x = [] 。
y = []
z = []
for a, b, c in zip(u, v, ind):
if 0 < a < 1920 and 0 < b < 1080:
x.append(a)
y.append(b)
z.append([c, c])
如果u、v和ind可能比1000000長,并且你必須停止在1000000項檢查,你只需在檔案的頂部添加一個匯入,from itertools import islice,并將for回圈本身改為:
for a, b, c in islice(zip(u, v, ind), 1000000) 。
無論哪種方式,你都從代碼中洗掉了所有的索引(在CPython參考解釋器中,索引的開銷與完成的有用作業的比例是最差的之一,盡管其他解釋器和工具(如Cython)會有不同的表現),如果你使用比a、b和c更好的名字,就會有更多的自我檔案化代碼。
預先系結append的副本,而不是動態系結,有一些小的好處(在Python的最新版本中有所減少),所以如果你真的對速度有需求,特別是在沒有優化創建系結方法的舊版本的Python上,你可以嘗試:
x = []
y = []
z = []
xapp, yapp, zapp = x.append, y.append, z.append
for a, b, c in zip(u, v, ind)。
if 0 < a < 1920 and 0 < b < 1080:
xapp(a)
yapp(b)
zapp([c, c])
(如果需要的話,添加islice)以減少方法呼叫的開銷,代價是更難看的代碼。絕對不要這樣做,除非剖析顯示這是熱門的代碼路徑,并且你真的需要它更快。
最后,請注意:如果這段代碼在頂層運行(在任何函式之外),它的運行速度將大大降低(在函式中對本地范圍內的名稱進行變數查找是一個 C 陣列查找;查找全域范圍內的名稱,即所有在函式之外的查找都涉及到,至少涉及一個 dict 鍵查找,這將大大增加成本)。把它放在一個函式中(連同x、y和z的定義;u、v和ind并不那么重要,如果你是zipping而不是索引它們的話)并呼叫該函式而不是在全域范圍運行,它應該運行得更快。
除此之外,使用numpy陣列而不是lists可能會有改進,但是你需要對你的問題有更具體的了解才能猜測這種改變的效用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/331576.html
標籤:
