为什么numpy的array那么快?

WBOY
發布: 2016-06-06 16:24:28
原創
3528 人瀏覽過

在python numpy中,如果我用10^6长度随机生成的list生成numpy array,那么生成耗时0.1s, 但是得到这个array的mean只需要init的2%的时间。 而我自己implement的array得到mean需要十几秒。
所以numpy的array十分黑科技是应为:
1)用底层代码太厉害?
2)init的时候partially compute了某一些中间量?(应为求mean的时间比access慢,比O(n)快 )
如果是2的话能否讲一下大概思路(不需要用python O(n)就能得mean)?
感激不禁!

回复内容:

numpy的许多函数不仅是用C实现了,还使用了BLAS(一般Windows下link到MKL的,Linux下link到OpenBLAS)。基本上那些BLAS实现在每种操作上都进行了高度优化,例如使用AVX向量指令集,甚至能比你自己用C实现快上许多,更不要说和用Python实现的比。。 你用blas试试 numpy底层使用BLAS做向量,矩阵运算。像求平均值这种vector operation,很容易使用multi-threading或者vectorization来加速。比如MKL就有很多优化。
<code class="language-python"><span class="n">a</span><span class="o">=</span><span class="p">[];</span><span class="n">s</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="n">n</span><span class="o">=</span><span class="mi">1000000</span>
<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span><span class="o">*</span>
<span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span><span class="o">*</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span><span class="o">*</span>
<span class="n">st</span><span class="o">=</span><span class="n">clock</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
	<span class="n">a</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">random</span><span class="p">())</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span><span class="n">s</span><span class="o">=</span><span class="n">s</span><span class="o">+</span><span class="n">i</span>
<span class="n">et</span><span class="o">=</span><span class="n">clock</span><span class="p">()</span>
<span class="k">print</span> <span class="s">"mean="</span><span class="p">,</span><span class="n">s</span><span class="o">/</span><span class="n">n</span><span class="p">,</span><span class="s">"time="</span><span class="p">,</span><span class="n">et</span><span class="o">-</span><span class="n">st</span><span class="p">,</span><span class="s">"seconds"</span>
</code>
登入後複製
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!