我一直在寻找方法来轻松多线程的一些简单的分析代码,因为我注意到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