Python,Java,C#和并行算法

时间:2011-06-10 02:50:05

标签: algorithm programming-languages parallel-processing

我想知道:尝试在Python中创建并行算法是否有任何优点?假设我想研究一种新的并行算法,我可以选择C,C#和Python,其中一种或哪种“更好”来测试和测试这些算法,或者它们只是“功能相当”,除了与解释/编译/ vm语言相关的常量,它们都是一样的吗?感谢

3 个答案:

答案 0 :(得分:4)

由于全局解释器锁定(GIL),Python不适合这种情况,因此它无法正常工作。 C在多线程环境中很难使用,但有一种替代 - Cilk语言。 C#是并行编程的不错选择。您可以使用任务并行库,并发数据结构和.NET Framework 4中的PLINQ。

答案 1 :(得分:0)

C有很多替代品,但它是一种低级语言。英特尔的Thread Building Blocks是一个基于Cilk的商业并行库,我听说它很好。

这取决于你想为Python做什么。虽然您可以通过使用Cython(一种预编译的Python变体)来回避GIL,但Cython编译速度很慢并且失去了平台独立性。此外,Python是一种脚本语言,因此您通常希望在并行化之前切换到更快的语言。话虽这么说,使用Python中的multiprocessing模块(要求回避GIL),您可以编写一些简单的并行代码。

Java可能是你最好的选择。 synchronized关键字以及合适的原语(例如线程安全的非阻塞队列)使其相对令人愉快。 Java虽然陈旧,但是你浪费时间编写比Python更详细的代码。

我慢慢地(渐进地)在Haskell中学习并行性。获得高效运行似乎并不是最简单的事情,但如果你的任务非常平行,那么它似乎运作良好。而且,当然,Haskell具有令人难以置信的表现力(在你克服它之后在语法上有很大的不同 - 因为它有很好的理由而不同),并且由于它的功能性,你不会得到奇怪的国家腐败问题;最糟糕的情况是你的代码不能扩展。有各种各样的库,比如STM(软件事务存储器),它们似乎比命令式程序员使用的原语(如锁)更好地解决了某些问题(在理论上)。

答案 2 :(得分:0)

我肯定会使用Python,因为编写Python程序既快速又简单,并且因为它可能已经包含了您需要的所有工具。它将允许您专注于算法,而不是处理语法和声明。

对于基准测试,您可以使用cProfiletimeit模块。

您想测试哪种并行算法?有许多方法可以进行并行编程。对于需要扩展到许多进程的算法,最简单的方法可能是使用MPImpi4py是一个非常好的Python实现,如果你需要处理数字数组,它与numpy紧密集成。

如前所述,由于multithreadingGIL只能使用1个处理器。但这种限制仅适用于这种情况。您可以在所需数量的处理器上使用multiprocessing

最后,Python中有functional programming的工具。 coroutines对于并发编程非常有用。