Python与C#/ .NET – 使用开发大型Web应用程序时需要考虑哪些关键差异?

我的组织当前提供的Web应用程序主要基于SQL Server 2005/2008后端,Java模型/控制器框架和基于ColdFusion的视图。 我们决定过渡到一个更新的框架,经过内部探索和迷你项目缩小了Python和C#/ .NET之间的select范围。

让我首先说我意识到任何一种技术都可以发挥作用,并且正在寻找关键的差异因素(以及相关的利弊)。这些语言有许多共同之处,很多都没有 – 我正在寻找你的想法在他们的关键差异。

示例权衡/差异性我在寻找:

虽然看起来你可以用更less的代码完成更多的工作,并且可以用Python创造更多的内容,因为.NET更加结构化,可能会更容易接pipe别人写的代码。

一些额外的信息可能是有用的:

我们的工程团队大概有20人左右,我们在5-7人的小团队里工作,经常轮stream进出。 我们编写别人写的代码,就像我们编写新代码一样。

使用python,我们将使用Django路由,使用.NET,我们将使用MVC2。 我们的服务器是运行IIS的Windows服务器。

我们喜欢ColdFusion的一些事情,包括它非常容易处理查询,并且我们可以将修复程序“热部署”到我们的Web服务器,而无需重新启动它们或打断任何人。


我读过一些涉及这两种语言的X和Y线程,发现它们非常有帮助,但是想直接把Python与.Net直接对抗。 提前感谢让我点击你的这个难题的经验!

“.NET”不是一种语言。 也许是Python与C#或者Python / Django与C#/ ASP.NET(或者select你想要的任何“webwork”; Python和“.NET”有很多不同的解决scheme,并且selectDjango或者MVC2)严重限制了更好的可行select)。 作为Python与“.NET”的对立面 :有IronPython (.NET中的Python)

我会考虑: 开发人员对一种语言的适应性,如果它们在Python和“.NET”中是平等的,那么我会考虑开发的周转时间,并select最小化的语言/“webwork”(再次,它不需要先前约束)。

尽pipe单元/集成testing对于任何[相当大的]项目都是必须的,但我发现静态types语言 (C#/ F#)可以大大减less与types有关的“愚蠢错误”的数量。

打开运动场:-)

编辑评论:

那么你只是比较语言。

在这种情况下,C#是一个非常枯燥的命令式静态types语言,它具有单一inheritance/接口类的OO(但是比Java更简洁的技巧,这只是彻头彻尾的石器时代)。 这是与Python相同的基本types的OO ,不包括静态/dynamic位, 这两种语言都是强types的 (机制是不同的,但是最终的结果在语言谱中是非常相似的)。 实际上,python有MI,但在python中使用'lambda'关键字似乎不那么被接受,并且因为python是dynamictypes的,所以没有编译时支持来确定接口/types契约(然而,有一些模块尝试提供这个)。

如果你可以学习/了解Python,那么你可以学习/知道C#。 这不是一个范式转变。 这里的一些关键字,大括号,需要说出你的意思是什么types,不同的基础库…不同的环境(你必须争取一些去一个REPL,但它是可行的在VS.)如何开发人员喜欢/学习/使用它是另一回事。 尽pipe之前我确实调用过C#命令,但很高兴看到添加了一些“类似function”的function,例如LINQ / IEnumerable扩展和闭包(无需委托),即使基本的C#语法非常程序化 – 再一次,漂亮很像Python(for-expressions,嵌套函数,语句/expression式划分)。

虽然新的“dynamic”确实模糊了线(很less有一个很好的用法 – 大概在所有相同的地方,可能不得不退回到以前的C#版本反思 – 这是不正确的,但关键是它通常是“错误的方式”,除非在恰好是“最好的/唯一的方式”的less数情况下),否则“var”不会。 也就是说,“var”variables的types在编译时已知的,并且与dynamictypes无关 ; 这都是types推断。 像F#/ SML和Haskell这样的语言有很多更强大的types推断,在保留静态types的同时,不需要“所有那些丑陋的types声明”(虽然明确地注释允许的types或者types的集合可以使意图更清晰)。

就个人而言, 除了一切之外 ,我会使用静态types的语言。 我不是说C#(而且我绝对不是说Java!),但静态types语言可以将types错误推到最前面,并要求事先明确的合同 (这对我来说是一个巨大的胜利)。 虽然你错过了一些整洁的dynamic技巧,但是用目标语言来执行同样的动作几乎总是有一个更好的方法 – 你只需要用这种语言来思考,用螺丝刀和锤子钉子。 例如,不要期望把依赖于(ab)使用local()或global()的Python代码原样带入C#。

在“下面”,大多数静态types的语言(这里的C#)需要一个明确的编译优先(但这不是很糟糕,因为它使漂亮的程序集)和像“REPL”的工具不被视为第一 – (这是F#/ VS2010中的一等公民)。 另外,如果你有一个基本的Python / C#库(而且它不能用其他语言提供),这可能是决定为什么select一种语言的决定性因素。

我写了一个关于Quora的非常全面的答案: Python如何与C#进行比较?

TL; DR

  • 答案是巨大的,但(希望)相当全面。 我在C#/ .NET上编程了近10年,所以我知道它非常好。 而且我现在在Quora上编程了大约7个月的Python,所以我希望我知道它非常好。

  • Python在以下方面获胜:易于学习,跨平台开发,开源库的可用性

  • C#赢得了:标准库,语言特性,开发过程和工具,性能,语言演化速度
  • 大体上甚至:语法(Python的可读性更好,C#具有更一致的语法),采用。

我还build议我们在做这样的动作之前,必须比较运行时间,而不是限制语言特征。 Python通过解释器CPython运行,其中C#在其默认实现中在CLR上运行。

多任务在任何大型项目中都非常重要。 .NET可以通过线程轻松地处理这个事情,而且它可以利用IIS(ASP.NET)中的工作进程。 CPython不提供真正的线程能力,因为GIL …每个线程在执行任何代码之前必须获取的锁,对于真正的多任务处理,您必须使用多个进程。

当我们在单个工作进程上的IIS上托pipeASP.NET应用程序时,ASP.NET仍然可以利用线程在不同的核心上同时处理多个Web请求,而CPython依靠多个工作进程来实现不同核心上的并行计算。

所有这些都导致了一个很大的问题,我们将如何在Windows上托pipePython / Django应用程序。 我们都知道Windows上的分支进程比Linux要昂贵得多。 所以最好是托pipePython / Django应用程序; 最好的环境是Linux而不是windows。

如果你selectPython,开发和托pipePython的合适的环境就是Linux …如果你像我从窗口来的,selectPython也会引入Linux的新的学习曲线…虽然现在不是很难…

在工业上的主要问题是python的dynamic性。 因为你有一种静态types语言的安全性。

但是现在我们有像PyCharm这样的现代IDE。 当你input你的代码时,他们整合了pylint和pep8“代码检查”和“styleguide-check”。 这消除了最愚蠢的错误。 所以你现在在Python中几乎有相同的安全性。

另一件事是,如果你需要“静态types检查”,当你需要时自己动手。 这是Python的实用性。

GIL是一个问题,但是你可以使用gevent或者ZMQ做一个线程。 但是在PyPy STM上正在进行中。

Python几乎可以在任何地方运行,而且您可以select不同的,大多数兼容的运行时(Wikipedia上的12) Wikipedia python interpreter list