‘壹’ 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自己的实现并没有加速。