Clojure或Scala用于生物信息学/生物统计学/医学研究

kli*_*ron 28 scala clojure bioinformatics

我不是一个专业的程序员(我的领域是医学研究),但我在C/C++和各种脚本语言方面都很有能力.不久前我被Lisp吸引了,但我没有时间认真学习它.在短暂接触R后,我决定在函数式编程语言上投入更多时间.

我想要JVM语言的实用性,从而缩小到Clojure和Scala.根据我的理解,两者都可以使用现有的Java库,并且在性能关键代码中给出的代理可以委托给Java,具有相对同样良好的性能.

这些语言在我需要的应用程序空间中如何比较?生物信息学中是否有任何实际项目使用?

已经存在的代码将是一个严重的优点,因为良好的文档和相当温和的学习曲线.另外,两者的并发模型如何相互比较?

任何人有任何显着的优点/缺点?

mik*_*era 31

我个人可以保证Clojure是这种工作的一个很好的工具.(我相信Scala也会很棒,我对它的经验也很少).

我的个人研究是在预测建模/机器学习领域,并且计算量很大 - 所以我认为它与生物信息学或生物统计学有许多相似之处.

我的个人方法/设置包括:

  • Incanter主要用作数据可视化工具.非常适合生成快速可视化,通常只有1行在REPL.还有很多统计和数字处理工具,我相信使用Colt库.我不是R的专家但是我知道Incanter大致是"R翻译成Clojure/Lisp".

  • 根据需要利用相当多的Java库.其中一些是我自己的,例如我用Java编写的算法,以便从JVM中获得最佳的微调性能.但是你可以同样轻松地使用任何其他可用的优秀Java库,因为从Clojure调用Java非常简单(.methodName对象param1 param2)

  • 相当多的高阶函数可以自动化我的工作流程.例如,我有一个更高阶函数,它将在循环中运行任何类型的优化算法达指定的时间量,然后生成每次迭代的改进的Incanter图.不是火箭科学,但在Clojure的几行中真的很容易编码.

  • 从来没有真的担心性能.如果你愿意,你可以让Clojure变得非常快(例如使用类型提示,原始算术支持等),但通常它是无关紧要的,因为无论如何你将在经过充分优化的库代码中花费99%以上的周期.因此,"胶水"代码中的一些开销可以忽略不计 - 我觉得通过使用动态,高级,功能性语言,我在个人生产力方面获得了更多.

  • 主要使用Clojure的并发功能 - 这必须是Clojure最强大的功能之一.我倾向于使用STM来编写并发进程,这些进程的事务不会相互干扰,然后在将来启动长时间运行的计算,以便我可以继续执行其他任务并等待结果通知.

  • 缓慢增长的宏集合,以便在需要时"扩展语言".我实际上使用的宏比我想象的要少(高阶函数通常是更好的选择).但是当你需要它们时它们是非常宝贵的 - 这是你真正欣赏同性语言价值的地方.由于它们有效地允许您向语言本身添加新语法,因此在正确使用它们构建所需的DSL时它们非常强大.

简而言之 - 我不认为Clojure作为一名研究人员会出错.

我可能不会将它用于(还)的一件事实际上是编写一个新的数值库 - 这在Scala或纯Java中可能会更好,因为您可能希望采用更强制/ OOP样式.


Rex*_*err 22

我不确定生物信息学和生物统计学本身,但我经常进行科学数据分析,我很欣赏Scala允许我相对容易地编写尽可能快的Java代码.我相信现在经常可以在Clojure中使用它,但我还没有看到支持它的基准.从目前来看,我觉得承担谨慎的事情是,他们根本同样表现出色.例如,参见计算机语言基准测试游戏,其中Scala在每次测试中都比Clojure快.(忽略Clojure可怕的"pidigits"结果 - Scala(和Java)正在调用用C语言编写的GMP库,Clojure可以这样做,但由于技术细节需要对库进行不同的包装,目前不允许游戏).看着多核比较并没有改善Clojure的表现,并注意到Clojure代码对于这些低级算法任务并不短.

Clojure目前在并行收藏方面处于领先地位,尽管Scala即将发布的2.9版本应该弥补差异.来自C++时,两者都没有温和的学习曲线; 鉴于语法外观看起来更为熟悉,Scala可能会更容易一些.我相信有很好的材料来学习每一个.


编辑:PS您可以使用rJava(特别是JRI接口)从Java调用R(因此可以从Clojure或Scala 调用).编辑以编辑:和,这些天,rScala.

编辑#2:在撰写本文时,Scala在所有事情上都比Clojure快; 在这个编辑中,Clojure在一个方面领先(以大量代码为代价) - 但无论如何,整体观点仍然存在.(并且可以加快那个测试的Scala实现.)

  • @amalloy - 我同意,除非有一个有缺陷的基准比基于_handwaving_和_warm模糊的感觉更好.想要另一个例子?好吧,http://wikis.sun.com/display/WideFinder/Results与最佳Clojure结果如何(特别是由任务的创建者Tim Bray称赞):http://meshy.org/2009/12 /13/widefinder-2-with-clojure.html同样,Clojure是在8m4s不错,但在5m32s比斯卡拉慢.但谁知道这是否意味着什么,因为使用的算法是不同的. (4认同)
  • 谨防使用基准游戏来比较代码大小/易用性,甚至比较性能.规则要求每种语言使用相同的算法 - 合理,因为我们不希望Clojure获胜只是因为编写C程序的人是愚蠢的(例如).但这意味着Clojure的代码通常非常单一,因为Clojure对可变性感到不满; 它通常会表现更差,因为语言针对不同类型的解决方案进行了优化. (3认同)

Art*_*ldt 17

如果您喜欢R,试试Incanter吧!它的R用Clojure的.

Scala适用于来自Java的人在语法上很容易,这对于来自C的人来说在语法上很容易,但是这样的两个间接级别可能会失去优势.

Clojure在大数据领域获得了很大的吸引力,并且很好地映射到了巨大数据的Hadoop作业.我认为这将是生物信息学领域的一大优势.

真的,这些东西主要是个人品味,所以尝试两者,看看让你开心:)

如果您希望在没有大量"智力开销"的情况下感受Clojure,我建议您使用leiningen快速启动测试项目吗?


olu*_*ies 12

为了建立在Rex的答案上,我想添加一些您可能感兴趣的Scala库/产品:


Ale*_*ard 9

我不知道Scala,所以我不能提供比较,但我在生物信息学项目中积极使用Clojure.

Java集成非常好,我使用BioJava库没有任何问题.

凡Clojure的并发模型照是不可改变的默认数据类型和函数式编程seq抽象.

在我的生物信息学工作中,我经常发现自己有很多输入数据(比如基因序列)需要进行相同的分析.一旦我有了分析功能,我可以map通过一系列输入(结果延迟生成).我已经充分利用了大型48核服务器,只需将其map更改为pmap.

单个字符更改的大规模并行化很难被击败!

当然,pmap是不是灵丹妙药,只有帮助时分析功能计算占主导地位,但事实证明,map并且pmap可以只被插入,显示出由Clojure的设计使优雅和简洁.


ama*_*loy 7

我只是熟悉Scala,所以我能做的最好的事情就是为Clojure传福音.这是一种很棒的语言,但是从一个发烧友那里得到了所有这些建议.

如果您正在寻找并发性,Clojure非常适合编程和性能.不可变数据结构意味着在没有任何手动和容易出错的锁定的情况下处理世界的连贯快照是微不足道的; STM使得以线程敏感的方式更改数据非常简单,而不会破坏其他人的快照.

我的理解是Scala有许多Clojure所做的很好的功能工具,但Clojure总是凭借成为Lisp而在语法上获胜.如果你想做一些专门的生物信息学,Clojure能够隐藏你不想要的Lisp,并将你自己的构造提升到与内置语言结构相同的水平.我现在找不到引用,但有一些关于Lisp的着名引用如下:

Lisp不是任何程序的完美语言.但它是为每个节目构建完美语言的完美语言.

这是可怕的释义,但根据我的经验,这是真的.看起来你需要一套相当专业的工具,而且没有一种语言会让那些像Lisp一样自然的感觉.


nic*_*kik 5

你必须问自己函数式编程对你有多重要.你知道C++所以你可能知道OO.我会说在Clojure中更容易做FP(因为你不能真正回到OO风格)在Scala中你最终会丢弃FP并做更多的OO风格.

我真的无法对你的应用空间说些什么.

既然你提到了R,就会有一个类似R的Clojure库来统计名为Incanter.我不知道您的应用程序空间中的其他现有项目.

有很多关于这两种语言的信息,所以这应该不是问题.两种语言的学习曲线都很陡峭.Clojure是一个小得多的语言,因为你已经知道一些口齿不清,所以不应该很难学习重要的东西.Scala有一个难以接受的类型系统,特别是因为你的主要经验是使用C/C++.

两种语言都有很好的并发模型,你可能会对这两种语言感到满意.