『壹』 vs 和 python 分析數據 哪個好
總的概括:R主要在學術界流行,python(numpy scipy)在工程方便比較實用。
R是S(Splus)的開源版本,或者下一代。發源地在紐西蘭奧克蘭。這個軟體的統計背景很濃烈。我這里濃烈的意思是,如果你不熟習統計知識(歷史)的話,R的幫助文檔看起來是很累的。由統計背景的人開發。R的維護組叫CRAN-R。在生物信息方便,有個叫bioconctor的組織,裡面有很多生物信息方面可以用的軟體包,他們有一套自己維護package系統。
Python是個綜合語言(這里特指指CPython解釋器),numpy scipy是數值計算的擴展包,pandas是主要用來做數據處理(numpy依賴),sympy做符號計算(類似mathematica?)此外還有一些不太成熟的包如sciki learn,statistical models。成熟度不如R。但是已經到了可用的水平了。是讀計算機的人寫的統計包。ipython 更新到1.0以後,功能基本完善,其notebook非常強大(感覺就像mathematica)而且還是基於web,在合作分享方面非常好用。
性能:
大家都說R慢,特別是CS的人。其實這里主要是兩點:一個R裡面數組的調用都是用復制的,二是Rscript慢。三是處理大數據慢。如果R用的好的話,R是不太慢的。具體來說就是Rscript用的少,多用命令,跑點小數據。這樣的話,實際在跑的都是背後的fortran和C庫。他們都有快二三十年歷史了。可謂異常可靠,優化得不能再優化了(指單線程,如果去看源代碼揮發先許多莫名的常數,永用了以後精度高速度快!)。比如一個自己編寫一個R腳本,loop套loop的那種,那真是想死的心都會有。外加一點,R處理文本文件很慢!
Python歸根揭底還是個有解釋器的腳本語言,而且有致命傷——GIL,但python最難能可貴的就是它很容易變得更快。比如pypy,cython,或者直接ctypes掛C庫。純python寫個原型,然後就開是不斷的profiling和加速吧。很輕易可以達到和C一個數量級的速度,但是寫程序、調試的時間少了很多。
並行計算:
R v15 之後有了自帶的parallel包,用挺輕松的。不過其實就是不停的fork,或者mpi,內存消耗挺厲害的。parSapply,parApply什麼的,真是很好用。
Python雖然有GIL——並行計算的死敵,但是有multiprocessing(fork依賴) ,是可以共享數據的什麼的,估計內存消耗方面比R好點,數據零散的話overhead很多。到了MPI的話,mpi4py還是挺好用的。用cython的話結合openmp可以打破GIL,但是過程中不能調用python的對象。
學習曲線:假設什麼編程都不會的同學。
R一開始還是很容易上手的,查到基本的命令,包,直接print一下就有結果了。但是如果要自己寫演算法、優化性能的時候,學習難度陡增。
Python么,挺好學的,絕大多數的幫助文檔都比R好了許多。有些包用起來沒R方便。總的來說深入吼R陡。
擴展資源:
基本上新的統計方法都會有R的package,安裝實用都不麻煩。但是基本上都是搞統計的人寫的計算機包。所以效能上可能有問好。比較出名的有兩個包的管理網站,cran-r 和bioconctor。 所以搞生化的估計R用起來很方便。
python的統計計算包們比R少,多很年輕,還在不斷的開發中。優於是計算機人寫的統計包,用起來的時候要多漲個心眼。
畫圖:
R自帶的那些工具就挺好用了,然後還有ggplot這種非常優美的得力工具。
python 有matplotlib,畫出來效果感覺比R自帶的好一些些,而且界面基於QT,跨平台支持。可能是R用得多了,pyplot用起來還是不太順手,覺得其各個組建的統一性不高。
IDE:
Rstudio非常不錯,提供類matlab環境。(用過vim-r-plugin,用過emacs + ess現在用vim。)
windows 下有python(x,y) 還有許多商業的工具。(本人現在的emacs環境還不是很順手~)
建議:
如果只是處理(小)數據的,用R。結果更可靠,速度可以接受,上手方便,多有現成的命令、程序可以用。
要自己搞個演算法、處理大數據、計算量大的,用python。開發效率高,一切盡在掌握。
ps:盲目地用R的包比盲目的地用python的包要更安全。起碼R會把你指向一篇論文,而python只是指向一堆代碼。R出問題了還有論文作者、審稿人陪葬。
『貳』 怎麼在mac 系統上使用Python怎麼安裝Anaconda
1. 首先安裝python,我選擇安裝Anaconda (Windows 64-Bit Python 2.7 Graphical Installer 下載地址)。
Anaconda的一些命令(在Anaconda的命令行窗口輸入):
conda list #該命令,將列出Anaconda安裝的所有應用包,我們可以看到Anaconda已經安裝了numpy, nose, pip, python, scipy, mingw等等。
conda install <pkg name> #該命令用於安裝應用包,如 conda install numpy.
pip install <pkg name> #該命令用於安裝應用包,如 pip install theano.
conda update <pkg name> #升級應用包,如 conda update python
2. 安裝Theano,在Anaconda 的命令窗口中輸入 pip install theano,可以看到程序開始下載安裝包,並檢查是否滿足安裝條件:numpy>=1.5.0,scipy>=0.7.2,滿足條件之後開始運行setup.py安裝theano,安裝完成後會顯示Successfully installed theano。
3. 測試Theano安裝情況。
(1)在ipython中輸入以下兩行代碼:
import theano
theano.test()
會顯示theano的版本號,安裝位置,已經其他包的安裝版本,如numpy,nose,python等。
在運行中出現g++不是內部或外部命令,也不是可運行的程序或批處理文件。
(2)在Anaconda的命令行窗口輸入:python Lib\site-packages\theano\tests\run_tests_in_batch.py
顯示unable to find theano-nose,查看run_tests_in_batch.py發現,其中路徑設置為在bin下尋找theano-nose文件,而實際上Anaconda文件夾下根本沒有bin這個文件夾,theano-nose存放在Scripts文件夾中。
》》》嘗試1:將Scripts更名為bin,重新運行這句命令,可以成功運行。但是出現一個warning,提示沒有檢測到g++,所以無法運行優化後的C代碼版本,只能執行python版本。
該種嘗試的結果是,下次打開Anaconda 命令窗口後出現錯誤,因為其運行路徑為Scripts,所以還是不要修改了。
(3)g++問題。我們打開MinGW文件夾,可以很清楚的看到有g++,但是為什麼使用不了呢??在Anaconda 命令窗口中輸入g++也能成功調用g++.exe啊。所以結論是,鑒於這個代碼中出現很明顯的漏洞,所以說不定這里也是錯誤,先不管這些了。
試著做了以下配置,也不知行不行。
添加環境變數: path: C:\Anaconda\MinGW\bin;C:\Anaconda\MinGW\x86_64-w64-mingw32\lib;
新建環境變數: PYTHONPATH: C:\Anaconda\Lib\site-packages\theano;
在home目錄下(cmd可以看到,我的是C:\Users\Administrator),創建 .theanorc.txt 文件內容如下:
[global]
openmp=False
[blas]
ldflags=
[gcc]
cxxflags = -IC:\MinGW\include
(4)驗證BLAS是否安裝成功。由於numpy是依賴BLAS的,如果BLAS沒有安裝成功,雖然numpy亦可以安裝,但是無法使用BLAS的加速。驗證numpy是否真的成功依賴BLAS編譯,用以下代碼試驗:
>>> import numpy
>>> id(numpy.dot) == id(numpy.core.multiarray.dot)
False
結果為False表示成功依賴了BLAS加速,如果是Ture則表示用的是python自己的實現並沒有加速。
『叄』 並行程序開發的語言現在有多少種
一般沒有專門的獨立語言,都是附加在傳統語言之上的,比如:
OpenMP附加在C、C++、Fortran之上
MPI(有多種,如MPICH)附加在C、C++、Fortran、Python、JAVA等語言之上
類似的還有Ateji PX、CUDA、OpenCL、OpenHMPP、PVM、Intel TBB、Boost Thread、Global Arrays、Charm++、Cilk、Dryad、DryadLINQ等等
還有傳統語言的並行化改進版,如Parallel C、High Performance Fortran、Co-array Fortran等
『肆』 怎樣用 Matlab 寫出優雅的代碼
用deal實現Python中的「一行賦多值」。
[H, W, N] = deal(42); % H = 42, W = 42, N = 42
[H, W, N] = deal(28, 28, 32); % H = 28, W = 28, N = 32, respectively
Matlab向量化的技巧網上文章很多,此處不表。矩陣操作和循環操作混雜的時候,考慮用structfun, arrayfun, bsxfun, cellfun等等,例如從N幅圖像中減去均值:
A = rand(H, W, N); % N 2D images
B = bsxfun(@minus, A, mean(A, 3)); % take out the mean
需要和高維數組(Tensor)打交道的話,思考時不要想著row, column, page這些術語, 要用dim_1, dim_2,... dim_M來思考。好多地方說Matlab是先存column, 用我們的術語其實就是Matlab按照從左到右:dim_1, dim_2,... dim_M的順序存儲元素。例如想想下面 2 x 4 x 3 x 5 矩陣的存儲順序:
sz = [2, 4, 3, 5]; % dim_1 = 2, dim_2 = 4, dim_3 = 3, dim_4 = 5
A = reshape( 1 : prod(sz), sz );
可能的話,用generic for。例如以下代碼哪個好一望便知:
z = [1, 3, 7, 11, 15];
for each = z
disp( each );
end
for i = 1: numel(z)
disp( z(i) );
end
用Matlab的方式組織自己的數據結構。比如,有時應該把struct當做dictionary用,比Python里的dict還方便。例如:
a.tom = 1; // insert (key = tom, value = 1)
a.jerry = 2; // insert (key = jerry, value = 2)
c = a.tom + 1; // access key = tom
理解cell的()引用和{}引用的區別。
理解Matlab傳遞參數時的逗號語義,以及相關的用cell實現變長參數的傳遞。例如:
x = linspace(0, 2*pi);
sty = {'linewidth', 2, 'color','r', 'linestyle','--'};
plot(x, sin(x), sty{:});
理解Matlab為面向過程編程、函數式編程提供了哪些語言層面上的支持。可變參數和返回值用varargin, varargout,Nested function相當於其它動態語言裡面的閉包,函數和類名也是first-class type,能方便的被當做參數傳遞(加@)。
Matlab對並行編程提供語言層面的支持,如parfor, spmd等關鍵字,你可以用類似openmp或者cuda C那樣的思維寫並行代碼。
在寫行業相關代碼時,函數參數和函數名可以用長名,別人調用時比較清晰。本地變數用短名,做這行的一看變知含義,自己也方便。例如 e = m * c^2等等。
寫面向過程Matlab代碼時,不要把所有的演算法流程都塞到一個幾百行上千行的函數里。把功能拆分成若干小函數。一個典型m文件的layout
function [r_1, r_2] = do_a (arg1, arg2, varargin)
t = 5
z1 = sub_1 (3);
…
z2 = sub_2 (4);
…
r_1 = …;
r_2 = …;
return;
function r = sub_1 (aa)
…
r = aa + t;
end
end
function t = sub_2 (bb)
…
end
代碼規模較大時,做好名字空間管理。如果有大量互相獨立的短函數,用靜態方法實現名字空間的管理。
classdef xxu
methods(Static)
function r = fun_1 (arg)
end
function v = fun_2 (arg)
end
end
end
調用時:
xy = xxu.fun_1(A);
vv = xxu.fun_2(A);
如果函數多,每個函數也比較大(比如一個函數就是一個幾百行的文件,裡面還有sub function, nested function),用pakage管理。例如新建一個叫 "+xxu"的文件夾(xxu前面一個加號),文件夾裡面有函數文件fun_1.m和fun_2.m,調用時就可以用名字空間xxu:
xy = xxu.fun_1(A);
vv = xxu.fun_2(A);
如果直接寫fun_1或fun_2就會出錯。
理解Matlab為面向對象編程提供了哪些支持。class的傳值,handle class的傳引用。繼承。定義介面的Abstract Class。將行業的演算法庫封成class是比較推薦的做法,近期的官方toolbox基本都開始轉向這種風格了。當然怎麼用OO的思維編程就是「功夫在Matlab外」了。
最後給題主潑點冷水,做科研的話,太大型的gui不適合用matlab搞。matlab的gui是給工toolbox提供一個可視化的portal。經典例子:信號處理中濾波器設計,matlab提供一個gui讓你手拖帶寬。
『伍』 有沒有簡單的中文python的openMP和MPI教程
MPI(MPI是一個標准,有不同的具體實現,比如MPICH等)是多主機聯網協作進行並行計算的工具,當然也可以用於單主機上多核/多CPU的並行計算,不過效率低。它能協調多台主機間的並行計算,因此並行規模上的可伸縮性很強,能在從個人電腦到世界TOP10的超級計算機上使用。缺點是使用進程間通信的方式協調並行計算,這導致並行效率較低、內存開銷大、不直觀、編程麻煩。
OpenMP是針對單主機上多核/多CPU並行計算而設計的工具,換句話說,OpenMP更適合單台計算機共享內存結構上的並行計算。由於使用線程間共享內存的方式協調並行計算,它在多核/多CPU結構上的效率很高、內存開銷小、編程語句簡潔直觀,因此編程容易、編譯器實現也容易(現在最新版的C、C++、Fortran編譯器基本上都內置OpenMP支持)。不過OpenMP最大的缺點是只能在單台主機上工作,不能用於多台主機間的並行計算!
如果要多主機聯網使用OpenMP(比如在超級計算機上),那必須有額外的工具幫助,比如 MPI + OpenMP 混合編程。或者是將多主機虛擬成一個共享內存環境(Intel有這樣的平台),但這么做效率還不如混合編程,唯一的好處是編程人員可以不必額外學習MPI編程。
『陸』 為什麼越來越多的科學家使用Python,Ruby而非Fortran
需要強調的一點是, 語言只是工具, 在特定應用場景下滿足特定需要的工具,
脫離應用場景來談不但沒有意義而且還會扣友善度。以下經驗(吐槽)都是針對大規模科學計算的, 個人電腦寫一個下午的代碼,然後跑十分鍾的代碼趁早去用
Python/R/Matlab/Ruby, 上手容易, 功能強大, 網上資源豐富, 絕對是您無悔的選擇。
大家的難用都是從
fortran77那裡感受來的,看過80年代的Fortran77代碼,混亂程度簡直爆表。再看2000年左右的Fortran95代碼,馬馬虎虎,
算是中規中矩的結構化語言。最近看過2010年左右的Fortran2003 code(Fortran的lua介面)
。抽象類,構造函數滿天飛,我擦好多feature都不知道。
所以你們批判的不是Fortran, 而是任性的,非結構化的coding
style。這不過恰巧搞科學的這票人都不太鳥coding standard和coding style,
所以Fortran寫出來的代碼大都比較亂, 這是使用者自身需要學習一個, 跟語言本身關系不大吧。見過師弟師妹們寫的C代碼,
比Fortran版本的還魔幻。
而C和C++裡面也有goto, 也有extern可以不做函數參數參數檢查,倒是沒見你們怎麼噴。Fortran裡面也有interface來聲明函數原型, 倒也沒見你們怎麼用。
比
如elemental, pure, 函數重載, forall, where,
Fortran95新加的功能一大部分是為並行度設計的,其語法也非常偏向高維的大數組操作, 自動並行化(openmp
workshare)用起來簡直比C++爽不知道多少倍。在OpenMP+MPI的場合加上千核量級的並行度,還是有優勢的。還有一種東西叫CAF,
CoArray Fortran, 專門針對大並行度的超級計算機添加了很多新語法,估計知道的人不多。
更不要說Fortran2003/2008支持面向對象。當然在虛函數方面好像比C++缺了一個功能, 其他都是完整復刻的。
所
以真要批判, 請先看看Fortran95/2003/2008在來批判, 哪怕只看目錄或者Feature
List也好。真正值得噴的是Fortran95裡面的mole的mod file的依賴問題, 寫Makefile很麻煩,
還有就是輸入輸出功能太弱, 必須要靠lua,hdf5,netcdf, json這些第三方工具來支撐。
至少說,只要不用implicit,Fortran編譯的時候可以精確地告訴你哪一行有問題。(對,我就是說給C++黨的, 最近做習題被虐的不要不要的)
如
果要用心做好一個代碼, 並行度在幾千CPU核心的量級上, 有核心維護團隊, 用戶在百人千人量級上的話,正確的姿勢是,
Fortran負責運算密集部分, C++/C負責常用邏輯和介面,
python/ruby/lua負責做膠水,負責暴露給不太關心細節的終端用戶。這套東西199幾年就有人在做,
結果到現在大家還在吵哪一個更好的問題。
-----2016-02-07 補充-------
獲悉Fortran2008裡面終
於對變數聲明坑進行了修補, 在2008之前的版本中, 變數只能在函數的開始部分聲明, 實際的聲明語句可能距離使用語句較遠,
同時可能引發臨時變數誤修改的情況, Fortran2008內加入了BLOCK結構, 可以當地生成臨時變數,
並顯式指明生存期,即使在BLOCK內部使用goto強行跳出, 編譯器也會釋放臨時變數,即
mole m
implicit none
contains
subroutine test1(a, b)
integer,intent(in) :: a
integer, intent(out) :: b
....(執行語句)
TMP1 : BLOCK
integer :: temp_var
temp_var = a*b
a = temp_var
END BLOCK TMP1
....(執行語句)
end subroutine test1
end mole m
『柒』 R 和 Python 用於統計學分析,哪個更好
總的概括:R主要在學術界流行,python(numpy scipy)在工程方便比較實用。
R是S(Splus)的開源版本,或者下一代。發源地在紐西蘭奧克蘭。這個軟體的統計背景很濃烈。我這里濃烈的意思是,如果你不熟習統計知識(歷史)的話,R的幫助文檔看起來是很累的。由統計背景的人開發。R的維護組叫CRAN-R。在生物信息方便,有個叫bioconctor的組織,裡面有很多生物信息方面可以用的軟體包,他們有一套自己維護package系統。
Python是個綜合語言(這里特指指CPython解釋器),numpy scipy是數值計算的擴展包,pandas是主要用來做數據處理(numpy依賴),sympy做符號計算(類似mathematica?)此外還有一些不太成熟的包如sciki learn,statistical models。成熟度不如R。但是已經到了可用的水平了。是讀計算機的人寫的統計包。ipython 更新到1.0以後,功能基本完善,其notebook非常強大(感覺就像mathematica)而且還是基於web,在合作分享方面非常好用。
性能:
大家都說R慢,特別是CS的人。其實這里主要是兩點:一個R裡面數組的調用都是用復制的,二是Rscript慢。三是處理大數據慢。如果R用的好的話,R是不太慢的。具體來說就是Rscript用的少,多用命令,跑點小數據。這樣的話,實際在跑的都是背後的fortran和C庫。他們都有快二三十年歷史了。可謂異常可靠,優化得不能再優化了(指單線程,如果去看源代碼揮發先許多莫名的常數,永用了以後精度高速度快!)。比如一個自己編寫一個R腳本,loop套loop的那種,那真是想死的心都會有。外加一點,R處理文本文件很慢!
Python歸根揭底還是個有解釋器的腳本語言,而且有致命傷——GIL,但python最難能可貴的就是它很容易變得更快。比如pypy,cython,或者直接ctypes掛C庫。純python寫個原型,然後就開是不斷的profiling和加速吧。很輕易可以達到和C一個數量級的速度,但是寫程序、調試的時間少了很多。
並行計算:
R v15 之後有了自帶的parallel包,用挺輕松的。不過其實就是不停的fork,或者mpi,內存消耗挺厲害的。parSapply,parApply什麼的,真是很好用。
Python雖然有GIL——並行計算的死敵,但是有multiprocessing(fork依賴) ,是可以共享數據的什麼的,估計內存消耗方面比R好點,數據零散的話overhead很多。到了MPI的話,mpi4py還是挺好用的。用cython的話結合openmp可以打破GIL,但是過程中不能調用python的對象。
學習曲線:假設什麼編程都不會的同學。
R一開始還是很容易上手的,查到基本的命令,包,直接print一下就有結果了。但是如果要自己寫演算法、優化性能的時候,學習難度陡增。
Python么,挺好學的,絕大多數的幫助文檔都比R好了許多。有些包用起來沒R方便。總的來說深入吼R陡。
擴展資源:
基本上新的統計方法都會有R的package,安裝實用都不麻煩。但是基本上都是搞統計的人寫的計算機包。所以效能上可能有問好。比較出名的有兩個包的管理網站,cran-r 和bioconctor。 所以搞生化的估計R用起來很方便。
python的統計計算包們比R少,多很年輕,還在不斷的開發中。優於是計算機人寫的統計包,用起來的時候要多漲個心眼。
畫圖:
R自帶的那些工具就挺好用了,然後還有ggplot這種非常優美的得力工具。
python 有matplotlib,畫出來效果感覺比R自帶的好一些些,而且界面基於QT,跨平台支持。可能是R用得多了,pyplot用起來還是不太順手,覺得其各個組建的統一性不高。
IDE:
Rstudio非常不錯,提供類matlab環境。(用過vim-r-plugin,用過emacs + ess現在用vim。)
windows 下有python(x,y) 還有許多商業的工具。(本人現在的emacs環境還不是很順手~)
建議:
如果只是處理(小)數據的,用R。結果更可靠,速度可以接受,上手方便,多有現成的命令、程序可以用。
要自己搞個演算法、處理大數據、計算量大的,用python。開發效率高,一切盡在掌握。
ps:盲目地用R的包比盲目的地用python的包要更安全。起碼R會把你指向一篇論文,而python只是指向一堆代碼。R出問題了還有論文作者、審稿人陪葬。
『捌』 anaconda 怎麼引用或者系統的python庫
1. 首先安裝python,我選擇安裝Anaconda (Windows 64-Bit Python 2.7 Graphical Installer 下載地址)。 Anaconda的一些命令(在Anaconda的命令行窗口輸入): conda list #該命令,將列出Anaconda安裝的所有應用包,我們可以看到Anaconda已經安裝了numpy, nose, pip, python, scipy, mingw等等。 conda install <pkg name> #該命令用於安裝應用包,如 conda install numpy. pip install <pkg name> #該命令用於安裝應用包,如 pip install theano. conda update <pkg name> #升級應用包,如 conda update python 2. 安裝Theano,在Anaconda 的命令窗口中輸入 pip install theano,可以看到程序開始下載安裝包,並檢查是否滿足安裝條件:numpy>=1.5.0,scipy>=0.7.2,滿足條件之後開始運行setup.py安裝theano,安裝完成後會顯示Successfully installed theano。 3. 測試Theano安裝情況。 (1)在ipython中輸入以下兩行代碼: import theano theano.test() 會顯示theano的版本號,安裝位置,已經其他包的安裝版本,如numpy,nose,python等。 在運行中出現g++不是內部或外部命令,也不是可運行的程序或批處理文件。 (2)在Anaconda的命令行窗口輸入:python Lib\site-packages\theano\tests\run_tests_in_batch.py 顯示unable to find theano-nose,查看run_tests_in_batch.py發現,其中路徑設置為在bin下尋找theano-nose文件,而實際上Anaconda文件夾下根本沒有bin這個文件夾,theano-nose存放在Scripts文件夾中。 》》》嘗試1:將Scripts更名為bin,重新運行這句命令,可以成功運行。但是出現一個warning,提示沒有檢測到g++,所以無法運行優化後的C代碼版本,只能執行python版本。 該種嘗試的結果是,下次打開Anaconda 命令窗口後出現錯誤,因為其運行路徑為Scripts,所以還是不要修改了。 (3)g++問題。我們打開MinGW文件夾,可以很清楚的看到有g++,但是為什麼使用不了呢??在Anaconda 命令窗口中輸入g++也能成功調用g++.exe啊。所以結論是,鑒於這個代碼中出現很明顯的漏洞,所以說不定這里也是錯誤,先不管這些了。 試著做了以下配置,也不知行不行。 添加環境變數: path: C:\Anaconda\MinGW\bin;C:\Anaconda\MinGW\x86_64-w64-mingw32\lib; 新建環境變數: PYTHONPATH: C:\Anaconda\Lib\site-packages\theano; 在home目錄下(cmd可以看到,我的是C:\Users\Administrator),創建 .theanorc.txt 文件內容如下: [global] openmp=False [blas] ldflags= [gcc] cxxflags = -IC:\MinGW\include (4)驗證BLAS是否安裝成功。由於numpy是依賴BLAS的,如果BLAS沒有安裝成功,雖然numpy亦可以安裝,但是無法使用BLAS的加速。驗證numpy是否真的成功依賴BLAS編譯,用以下代碼試驗: >>> import numpy >>> id(numpy.dot) == id(numpy.core.multiarray.dot) False 結果為False表示成功依賴了BLAS加速,如果是Ture則表示用的是python自己的實現並沒有加速。