推 grtfor:直譯擅長的不在效率呀,有改進方法但要追上很難~ 08/05 01:00
推 ccwang002:你不應該一個元素一個元素自己乘,這樣會慢很多 08/05 01:10
推 ccwang002:多用 numpy array級操作才會快,python for-loop 會太慢 08/05 01:14
→ ccwang002:另外,我找到 scipy.ndimage.filters.sobel 可以呼叫 08/05 01:14
→ ccwang002:點旁邊的 source 就可以知道它 code 怎麼寫的 08/05 01:15
推 vic0330:不知道range改xrange會不會比較快 08/05 08:37
→ redonizuka:想更詳細的問一下何謂 numpy array級操作 08/05 09:36
推 ccwang002:比如 i j 迴圈改成 np.sum(img * (kernalx + kernaly)) 08/05 10:24
推 ccwang002:選部份矩陣應該用 img[x:x+3, y:y+3] 這型式的取值 08/05 10:30
→ ccwang002:大原則避免自己寫 for 或複雜運算,numpy 本身是 C 速度 08/05 10:31
→ ccwang002:看 scipy 寫法,它只用了 correlate1d 這函式就實作完了 08/05 10:32
→ ccwang002:我不懂 sobel 沒法給建議,不夠快的話也可考慮 Cython 08/05 10:33
推 LiloHuang:它會編譯成 bytecode 來跑呀,只是 CPython 挺慢是事實 08/06 20:27
→ LiloHuang:現階段 CPython 也沒有像 Java 或 .NET 有做 JIT 優化 08/06 20:28
→ LiloHuang:迴圈自然就是不會快去哪邊,做 Convolution 用 GPU 最快 08/06 20:29
推 LiloHuang:退而求其次就是用 numpy.convolve + numpy.absolute 08/06 20:33
→ LiloHuang:NumbaPro 聽說挺不錯的,可以用到 GPU 來加速... 08/06 20:35
推 LiloHuang:另外,Sobel filter 是 separable filter 我想你知道 :D 08/06 22:19
→ LiloHuang:儘管從 2D kernel 改 1D kernel 對於 Python 也沒快很多 08/06 22:20
推 fischcheng:Numba 08/08 06:36
推 LiloHuang:社群版的 Numba 效果應該也不錯吧,NumbaPro 得花錢就是 08/08 09:28
→ ming1053: 跟matlab道理差不多啊 多用 vectorization 08/11 11:10
→ redonizuka: 感謝大家的發問,我持續摸索,大家對我幫助很大,謝謝 08/13 16:31
推 neutrino: 離題一下 希望 numpy on pypy 早日實現 08/14 16:56