Python与C#/.NET的主要区别是什么,使用它们开发大型Web应用程序时需要考虑哪些关键因素?

58

我的组织目前提供基于SQL Server 2005/2008后端、Java模型/控制器框架和基于ColdFusion的视图的Web应用程序。我们决定转向更新的框架,并在内部探索和小型项目后将选择范围缩小到Python和C#/.NET之间。

首先声明,我意识到任一技术都可以很好地工作,我正在寻找其关键差异(以及相关的优缺点)这些语言有很多相同之处,也有很多不同之处--我想听听您对它们主要区别的看法。

我正在寻找的示例权衡/差异化因素:

虽然Python似乎可以用更少的代码完成更多的任务并且更具创造性,但由于.NET更加结构化,因此可能更容易接手理解和修改别人编写的代码。

一些额外的信息可能会有所帮助:

我们的工程团队大约有20人,我们小组的人员为5-7人,我们经常轮换人员。我们的编码工作中,我们通常需要处理别人编写的代码。

对于Python,我们将采用Django路线,而对于.NET,我们将采用MVC2。我们的服务器是运行IIS的Windows服务器。

我们喜欢ColdFusion的一些功能,如其非常易于处理查询以及我们可以“热部署”修复程序到我们的Web服务器上而无需重新启动它们或中断任何人的工作。

我已阅读了一些涉及这两种语言的其他X vs Y主题的帖子并发现它们非常有帮助,但我想直接将Python与.NET进行对比。


你是在开发网站还是网络应用程序?因为我觉得像GWT这样的工具更适合“应用程序”。 - Matthew Olenik
谢谢你的建议,马特!我们正在开发一个带有ajax、异步处理等功能的Web应用程序。例如,用户输入一些设置来排队进行计算密集型操作(这些操作涉及查询数据库中的表),并在结果可用时呈现结果。有许多不同的页面、小部件等。诚然,我们没有花太多时间探索GWT,因为它与我们目前拥有的非常相似。此时,我们正在考虑Python和.Net,并专注于向前迈进。 - Aaron Silverman
3
".NET"不是一种语言。也许是Python vs. C#,或者Python/Django vs. C#/ASP.NET(或选择任何您想要的“webwork”;对于Python和“.NET”,有许多不同的解决方案)-- 还有IronPython[http://ironpython.net/](Python“在.NET”中)。 - user166390
1
不错的观点pst,我在谈论C#ASP.NET与MVC2。 - Aaron Silverman
我提到GWT是因为如果你在制作类似于桌面“应用程序”的东西,它比我的知识范围内.NET或Python提供的任何东西都更适合。虽然我认为有一个类似于Python的GWT项目。 - Matthew Olenik
你可以使用IronPython或PythonNET将两者结合起来。 - denfromufa
4个回答

43
“.NET”不是一种语言。也许是Python vs. C#或Python/Django vs C#/ASP.NET(或选择您想要的任何“webwork”;对于Python和“.NET”,有许多不同的解决方案,选择Django或MVC2可能会严重限制更好的可行选项)。作为Python vs. “.NET”的反驳:有IronPython(Python“在.NET中”)。
我会考虑:开发人员对语言的熟悉程度,如果他们在Python和“.NET”中相等,则会考虑开发周转时间,并选择最小化此时间的语言/“webwork”(同样,它不需要是以前的约束)。
虽然单元/集成测试对于任何[可观]项目都是必须的,但我发现静态类型语言(C#/F#)可以大大减少与类型相关的“愚蠢错误”的数量。
打开比赛场地:-) 评论编辑: 那么你只是在比较语言。
在这种情况下,C# 是一种非常无聊的命令式静态类型语言,具有单继承/接口类基础面向对象(但比 Java 多了一些不错的技巧,而 Java 则是彻头彻尾的石器时代)。这是与 Python 相同的基本面向对象类型,除了静态/动态部分之外,两种语言都是强类型的(机制不同,但在语言范围内结果相当相似)。实际上,Python 有 MI,但似乎在 Python 中不太被接受,因为使用“lambda”关键字以及由于 Python 是动态类型的,所以没有编译时支持来确定接口/类型合同(但是有一些模块试图提供此功能)。 如果你能学会/了解Python,那么你也能学会/了解C#。 这并不是一个范式转变。有些关键词在这里,大括号在那里,需要指定你想表达的类型,在不同的基础库中......不同的环境(你需要花一些时间才能进入REPL,但在VS中可以实现)。开发者喜欢/学习/使用它的方式是另一回事。虽然我以前把C#称为命令式编程语言,但很高兴看到添加了一些“函数式”特性,如LINQ/IEnumerable扩展和闭包-无需委托,即使基本的C#语法非常过程化——再次说明,与Python非常相似(for-表达式,嵌套函数,语句/表达式划分)。

虽然新的“dynamic”确实模糊了界限(在以前的C#版本中,人们可能不得不退回到反射的所有相同位置,但这并不是真的,但重点是通常是“错误的方法”,除非在少数情况下它恰好是“最佳/唯一的方法”),但“var”不是。也就是说,“var”变量的类型在编译时已知,并且与动态类型无关;这都是类型推断。一些语言,如F#/SML和Haskell,具有更强大的类型推断功能,消除了“所有那些丑陋的类型声明”的需要(尽管明确注释允许的类型或类型集可以使意图更清晰),同时保留静态类型。

个人而言,除了其他方面,我会选择使用静态类型语言。我并不是说C#(绝对不是Java!),但是静态类型语言可以将类型错误推到顶部,并要求明确的前期合同(这对我来说是一个巨大的胜利)。虽然你可能会错过一些有趣的动态技巧,但在目标语言中执行相同操作的方法几乎总是更好的方式--你只需要用螺丝刀拧螺丝,用锤子敲钉子。例如,不要指望将依赖于local()或global()的Python代码原封不动地带入C#。
“缺点”是,大多数静态类型语言(如C#)需要显式编译(但这并不糟糕,因为它可以生成漂亮的程序集),而像“REPL”这样的工具则不被视为一等公民(在F#/VS2010中它是一等公民)。此外,如果你有一个对Python/C#至关重要的库(而且在另一种语言中不可用),那么这可能是选择一种语言而不是另一种语言的决定性因素。

虽然我不愿意限制我们的选择,但Django或MCV2是我们应该开始的地方,毕竟总得从某个地方开始。我想要了解的是开发者的舒适度,通过了解关键差异来做到这一点。例如,静态类型与动态类型就是一个关键差异,还有像C#中的var和dynamic这样的东西,可以模糊界线。 - Aaron Silverman
20
不是很准确,据我所知,C#的var并不是动态的,var类型在编译时确定而不是运行时,这样你就可以在编码时获得所有好处,如智能感知和错误检查。换句话说,“int number = 5”和“var number = 5”将被编译为相同的中间代码。 - Jesus Rodriguez
提问者并不是在询问语言之间的区别,而是在询问特定技术(在这种情况下是.NET和Python)的可行性。 - dns
5
这不是正确的答案,他只是试图推广特定的编程语言(Python),并打压其他的语言(Java/C#)。 - dns
按照语言对比的标准来看,这是一个非常不拘泥于教条且公正的回答。赞! - Spike0xff
虽然静态类型语言确实有助于防止类型错误,但它可能并不像听起来那样重要。通过现代工具(如VS Code及其Python扩展),pylint和任何合适的单元测试,这一点几乎可以被推到无关紧要的地步。 - Alen Siljak

30

我在Quora上写了一篇非常全面的回答:Python与C#相比如何?

简短版:

  • 回答很长,但(希望)相当全面。我在C#/.NET上编程将近10年,所以我真的很了解它。我在Quora上用Python编程已经大约7个月了,所以我希望我也很了解它。

  • Python胜在:易学性、跨平台开发、可用的开源库

  • C#胜在:标准库、语言特性、开发流程和工具、性能、语言演进速度

  • 大致相等:语法(Python在可读性方面更好,C#的语法更加一致),采纳率。


1
Python在Windows平台上的性能无法与C#相媲美,你可以在各处找到基准测试数据。这是一个重要的观点。 - ozgur
我不熟悉Python。它是否具有DI和支持单元测试?如果没有,我不确定它如何被认真考虑用于生产环境。 - Quark Soup

7
我建议我们在进行这样的选择之前,要比较运行时间,而不是限制于语言特性。Python通过解释器CPython运行,而C#则是以CLR为基础的。在任何大型项目中,多任务处理都非常重要;.NET可以通过线程轻松处理这一点...还可以利用IIS(ASP.NET)中的工作进程。由于GIL,CPython没有提供真正的线程处理能力...每个线程在执行任何代码之前都必须获取锁定,要实现真正的多任务处理,必须使用多个进程。
当我们将ASP.NET应用程序托管到单个工作进程上时,ASP.NET仍然可以利用线程来同时处理不同核心上的多个Web请求,而CPython则依赖于多个工作进程来实现在不同核心上的并发计算。
所有这些都引出了一个重大问题,即如何在Windows上托管Python/Django应用程序。我们都知道,在Windows上分叉进程要比Linux更加昂贵。因此,最理想的环境是Linux而不是Windows。
如果您选择Python,则开发和托管Python的正确环境应该是Linux...如果像我一样从Windows转移过来,选择Python也会带来学习Linux的新曲线...虽然这些天已经不太难了...

3
在工业中,Python的动态特性是主要问题。因为静态类型语言具有某种安全性。
但是现在我们有了像PyCharm这样的现代IDE。当您输入代码时,它们集成了pylint和pep8“代码检查”和“样式指南检查”。这消除了最愚蠢的错误。因此,现在Python几乎具有相同的安全性。
另一件事是,如果您需要“静态类型检查”,则可以在需要时自己进行。这是Python实用主义的本质。
GIL是一个问题,但是您可以使用gevent或ZMQ来进行某种线程处理。但是PyPy STM上的工作还在进行中。
Python几乎可以运行在任何地方,并且您可以选择不同的(在维基百科上有12个)大多数兼容的运行时。 Wikipedia python interpreter list

这可能是一个重要的观点,因为Python可以在几乎任何平台上运行(包括通过Termux在Android上运行)。然而,在给定的情况下,这可能并不那么相关。 - Alen Siljak

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