Python对于以科学计算为重点的算法是否合适?

5
我的编程兴趣主要是算法,最近我看到很多知名研究人员在Python中编写了大量的代码。Python在科学计算方面有多容易和方便?它有可以与Matlab相媲美的算法库吗?Python是一种脚本语言还是需要编译?它是否适合用于原型算法?如果我已经比较熟悉C和面向对象编程,那么学习Python到能够实际生产需要多长时间?它是基于面向对象的吗?
抱歉问题表述比较简洁,但我非常好奇,希望有更有经验的程序员能帮帮我。

12
说回这个话题,航空餐到底是怎么一回事? - kubi
7
抱歉,你能否直接谷歌一下吗? - Rob Lourens
8
@Rob,你可以“只是谷歌”搜索 Stack Overflow 上的90%的问题,但这并不是重点。参见此处的讨论:http://meta.stackexchange.com/questions/8724/how-to-deal-with-google-questions。 - Michael Mrozek
2
你可能想从这里开始:http://python.org/about/help/ - Daniel Pryden
2
我只是在说,如果搜索“Python科学计算”或阅读维基百科文章,所需要的时间会更少,并且获得的信息也会更有价值。 - Rob Lourens
显示剩余2条评论
8个回答

16

Python在科学计算方面有多么易用和方便?

Scipy/NumPy。

它是否有与Matlab相媲美的算法库?

是的。

Python是一种脚本语言还是编译语言?

解释性语言。

它是否是用于原型设计算法的绝佳语言?

是的。

如果我已经精通C并了解面向对象编程,那要学习足够的Python以提高我的生产力需要多长时间?

取决于个人情况。

Python是基于OO的吗?

是的。


7
关于OO,需要注意的是,虽然Python是面向对象的,但它不像Java或C#那样强制要求用户遵循面向对象的范式。在Python中,所有东西都是对象,但你可以采用函数式、面向对象或过程式的编程风格。 - Nathan Ernst
1
Python被编译成字节码,然后像Java一样进行解释。 - jfs

14

Python在科学计算方面的易用性和便利性如何?

非常好!你应该尝试参加SciPy会议(每年在美国和欧洲各有一次),以真正感受它的优势,但即使只是在 scipy.org 网站上看也能给你留下深刻印象。

Python的算法库与Matlab相比如何?

我不了解Matlab,但是可以说针对Python可用的工具非常多。

Python是脚本语言还是编译语言?

Python是一种语言,它提供了许多实现方式(全部开源)。

最流行的一种实现方式是CPython,它将源代码编译为自己的字节码,然后由虚拟机执行(编译速度非常快,并且只在需要时才进行透明地编译,但编译文件通常存储在磁盘上并且只在需要时重新编译)。这非常类似于Java/JVM或C#/.Net,除了编译步骤可以被合并到执行步骤中(当然,如果您想要的话,也可以有一个构建系统进行预编译)。

Jython将代码编译为JVM字节码,由JVM执行;Microsoft的IronPython(我相信这是他们的第一个完全开源项目)将代码编译为CRL(".Net bytecode"),然后可以被.Net和Mono执行。它们都支持即时编译和预先编译到各自的字节码。

PyPy可以将Python源代码编译成许多东西,包括(对于Python的子集)直接(提前)编译为本机机器语言或(对于所有Python)编译为中间代码,然后以即时编译方式编译为机器语言。在构建系统方面,PyPy非常灵活。(它的名称来自于其本身用Python编写的事实,在许多方面这仍然是一个优点,但它所生成的代码的速度和灵活性是当今最大的优势。)
这四个实现目前都是生产质量(历史上,它们按我列出的顺序逐渐成为生产质量-- PyPy最近,实际上相当近,但我很喜欢这些天看到的东西)。
“它是一个用于原型设计算法的好语言吗?” 我想不出有更好的了;请参见《Python Cookbook》的第18章,特别是Tim Peters撰写的介绍。我刚才给出的Google Books链接中的介绍完全可读,我无法在已经很长的SO答案中做到公正;请点击链接并阅读该介绍!
“如果我很熟悉C和面向对象编程,学习足够的Python使自己变得有生产力需要多长时间?”
当我第一次接触Python时,浏览完教程后,我决定在与家人度过的一个周末空闲时间里尝试一下:我会把一个周末(从周五晚上6点到周日午夜,或者说,可能是周一凌晨的几个小时)专注于通过编写一个CGI网页应用程序来计算和展示各种桥牌概率(作为一名桥牌爱好者,但在该领域中主要是通过我的概率和计算机工作而闻名,这是一个我长期以来喜欢的问题:我在大一时学习了Fortran,虽然当时作为一名EE专业学生,我不应该在大三之前进行编程,但通过打卡片来解决这类问题;-)。

当然,我并没有指望在54个小时左右(减去睡眠时间;-)内从头开始完成任务,同时自学语言及其库(CGI和所需的算法我已经非常熟悉),但我想看看我能走多远(评估Python与当时我精通的其他语言,主要是perl和C ++之间的差异)。

不到24小时后(诚然,那晚我没睡多少,因为我太兴奋了),我退后一步,不得不承认我完成了——我的小CGI Web应用程序不仅具有我所想象的所有功能,而且我还通过从头开始构建一个小模板系统使它能够输出不同的自然语言(我知道有很多这样的工具——这就是我将它命名为yaptu,“Yet Another Python Templating Utility”的原因——但我没有时间学习语言和标准库之外的任何东西……自己动手比较快;-)。

那时我无法挽回地爱上了Python。不久之后,我离开了我现有的高飞职业,在写书和使用Python自由职业的一段时间后,几年后我横跨一个海洋和两个大陆加入了其中一个广泛使用Python的最大公司(我的现任雇主Google)——在此期间重新结婚(和我的现任妻子安娜——她也是我书中的合作者和Python软件基金会的第一位女成员)。我们的“虚荣”车牌上写着P♥THON……;-)。所以,好吧,我有偏见。但这一切都始于那不到24小时的时间里,我完成了比我在超过54小时内希望完成的更多的工作(尽管像所有软件开发人员一样,每当涉及到“我要做X需要多长时间”时,我都是一个不可救药的乐观主义者;-)。

它是基于面向对象的吗?

是的,但它是多范式的(像C++一样...但比C++更多)--当您不需要使用class时,您不必使用它们,而且它对函数式编程也有合理的支持(绝对不像Haskell这样的“真正”FP语言那么深入,但对于许多任务仍然非常有用)。


感谢您详细的回答,我很喜欢阅读它 :) - ldog
你应该提到你是《Python Cookbook》的合著者。 - jfs

11

它会进行字节编译,然后将字节码通过解释器发送。

官方教程

NumPy

现在您已经设置好了。


哦,numpy 有 fft :) 我已经喜欢它了。 - ldog
1
@gmatt,Python自带“电池”,Python的强大之处在于其语言本身简洁干净,而库又是庞大且功能齐全的。学习标准库所需的时间比掌握核心语言需要更长。 - Nathan Ernst

8

逐一回答您的问题:

Python在科学计算方面非常易用和方便。它提供了非常直观的编码方式,强大的内置数据结构如字典和列表在科学计算中非常有帮助。此外,作为一种动态语言,您不需要像C语言那样处理许多底层细节。

它是否有与Matlab相当的算法库?

确实,Python拥有众多的算法库。例如,您可以使用NumPy和SciPy支持大型、多维数组和矩阵运算。您可以在以下链接中找到更多详细信息:

  1. NumPy官方网站: http://numpy.scipy.org/
  2. NumPy的维基百科页面: http://en.wikipedia.org/wiki/NumPy

此外,Python还有用于支持网络分析的库。例如,networkx库是进行图形分析的绝佳工具。

Python是脚本语言还是编译语言?

通常情况下,Python被设计为一种脚本语言。但也有编译工具,例如py2exe。我建议您将Python作为脚本语言使用。我认为您可能会对Python的性能有所担忧。通常的解决方案是在C/C++中编写那些性能批评模块,并通过SWIG进行粘合。

它是否是用于原型设计算法的绝佳语言?

当然是的。由于嵌入式数据结构得到了丰富的支持,您可以使用比C/C++更短的代码快速实现一些复杂的算法。以下是一个典型的例子:

 //C++ loop a one dimensional array and print value
  const int N = 100; 
  int A[N];
  for (int i = 0; i < N; ++i)
      cout << i;

#python loop a one dimensional array and print value
for i in range(100):
   print i


  

作为一种脚本语言,Python不需要编译、运行、重新编译、再运行,这将节省您很多时间。
如果我已经精通C语言和面向对象编程,学习Python到能够提高工作效率需要多长时间?Python是基于面向对象编程的吗?
Python与C语言不同。你可能会发现在Python中编写C风格的代码并不是很方便。但是Python很容易入门,大部分语法都是用简单的英语表达的。此外,有一些非常好的Python教程。例如,《深入Python》对初学者非常友好。
Python提供了面向对象编程的机制。

很多人(包括这个人)认为《Python深入浅出》是一本对于初学者来说很糟糕的书。http://oppugn.us/posts/1272050135.html - Dominic Bou-Samra
@Dominic Bou-Samra,也许不同的人有不同的想法,但是我确实从这本书中学到了很多。 - xiao 啸

4

我已经使用Python进行科学计算6年了。由于我之前使用matlab/IDL,因为Python也是解释性语言,所以切换非常容易。

有第三方工具,如SciPy和Matplotlib,可以帮助特别处理数据分析/可视化。此外,如果您在Amazon上搜索,会发现有很多面向这个受众的书籍。

Python也经常用于教授编程,因为它的语法简单而强大。


3
如果你懂C语言和一些面向对象编程,你会很快学会Python——大部分关键知识只需阅读/尝试几个小时。以下是主要区别: - 旨在快速学习并鼓励编写可读性高的代码。 - 具有任何面向对象编程语言中最少的缺点。 - 不强制您编写面向对象的代码。 - 可以轻松编写可以独立执行或导入到其他脚本的脚本。
面向对象特性: - 真正的多态性。与C++和Java等衍生语言不同,您不必费尽心思才能使您的代码具有多态性、通用性和重用性——即使以前没有考虑过的方式也可以。这是因为虽然它是强类型的,但它不是静态类型的。因此,只要您的对象具有某些代码需要的预期方法或属性,它就会起作用。这被称为鸭子类型。 - 内省——因此您可以在访问方法或属性之前轻松检查其是否存在。也非常适用于调试。 - 您可以在运行时向对象添加属性甚至方法。非常灵活的代码。 - 支持多重继承。
问题: - 通常比Ruby快,但有时比Java慢。 - 你必须习惯到处都能看到self这个词。 - 对于C风格的开发人员来说,很难放弃键入花括号和分号的习惯。看到像那样简洁的代码会让你感觉好像缺了什么。
所有Python开发人员都应遵循的编程风格指南: http://www.python.org/dev/peps/pep-0008/ 有一种变体比主版本更快,并支持易于使用的并发机制。它被称为Stackless Python,因为它不使用C堆栈。EVE Online就是用这种语言编写的。
以下是一个可以被认为是科学编程的示例 - 调整声波 - 简直太酷了 - 滚动到底部查看源代码,看看它相对简单的样子。 http://musicmachinery.com/2010/05/21/the-swinger/

1
Python适合于专注于科学计算的算法吗?

是的。


1

你问到编译/解释的问题。如果你关心的是执行速度,Python 有一个方面似乎没有被明确提到——你可以使用 SWIG 和 boost.python 等工具,将你的闪电般快速的 C/C++ 包出现在 Python 中作为模块。一旦你到达模块,它将以底层 C/C++ 实现的速度/效率运行。许多模块都利用了这一点。

因此,你可以在清晰、灵活、易学的 Python 中完成所有组织工作,然后当你进行大量数值计算时,你可以将问题交给快速、高效的例程。你得到了两个世界最好的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接