我一直在尋找方法來輕鬆多線程的一些簡單的分析代碼,因爲我注意到numpy它只使用一個核心,儘管事實上它應該是多線程的。爲什麼不是numpy.mean多線程?
我知道numpy被配置爲多核心,因爲我可以看到使用numpy.dot的測試使用了所有的核心,所以我只是將其重新實現爲點積,並且運行速度更快。是否有某種原因意味着它不能單獨運行?我發現對於較大的陣列也有類似的行爲,雖然比例接近2比我的例子中顯示的3。
我一直在閱讀一堆類似numpy速度問題的帖子,顯然它的方式比我想象的要複雜。任何見解都會有所幫助,因爲它更具可讀性並且代碼更少,所以我寧願使用mean,但我可能會切換到基於點的方式。
In [27]: data = numpy.random.rand(10,10)
In [28]: a = numpy.ones(10)
In [29]: %timeit numpy.dot(data,a)/10.0
100000 loops, best of 3: 4.8 us per loop
In [30]: %timeit numpy.mean(data,axis=1)
100000 loops, best of 3: 14.8 us per loop
In [31]: numpy.dot(data,a)/10.0 - numpy.mean(data,axis=1)
Out[31]:
array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 1.11022302e-16, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
-1.11022302e-16])
我想這是因爲numpy是用python編寫的,而python中的多線程因爲GIL而效率很低。 –
@Riateche numpy的核心是用C編寫的。 – agf
一定要做一個叫做'mean'的函數來使用,而不是在任何地方使用點的東西,所以如果'numpy.mean'改進,你可以稍後改變它。 – kwatford