我的组织目前主要基于SQL Server 2005/2008后端、Java模型/控制器框架和基于ColdFusion的视图交付Web应用程序。经过内部探索和小型项目,我们决定过渡到更新的框架,并将选择范围缩小到Python和C#/. NET之间。
让我先说一下**我意识到这两种技术都能很好地工作,并且正在寻找它们的主要区别(以及相关的优缺点)**这些语言有很多共同点,也有很多不同点--我希望您能理解它们的主要区别。
- 我正在寻找的权衡/竞争优势示例:*
虽然看起来你可以用更少的代码完成更多的事情,并且使用Python更有创造性,但由于.NET更结构化,它可能更容易接管理解和修改别人编写的代码。
- 一些可能有用的额外信息:*
我们的工程师团队大约有20人,我们分成5-7人的小团队,经常轮换人员。我们编写别人编写的代码和我们编写新代码一样多。
如果使用python,我们会走Django路线,如果使用.NET,我们会选择MVC 2。我们的服务器是运行IIS的Windows服务器。
我们喜欢ColdFusion的一些地方包括它非常容易处理查询,我们可以“热部署”修复我们的Web服务器,而不必重新启动它们或中断它们上的任何人。
我读过一些其他涉及这两种语言的X vs Y主题,发现它们非常有帮助,但我想直接让Python与.Net进行正面交锋。
4条答案
按热度按时间2q5ifsrm1#
“.NET”不是一种语言,可能是Python对C#,或者Python/Django对C#/ASP.NET(或者选择任何你想要的“网络作品”; Python和.NET都有很多不同的解决方案,选择Django或MVC 2可能会严重限制更好的可行选择)。作为Python与.NET的对抗:有IronPython(Python“在.NET中”)
我会考虑:* 开发人员对一种语言的舒适度 *,如果它们在Python和“.NET”中是相等的,那么我会考虑开发的周转时间,并选择最小化这一点的语言/“Webwork”(同样,它不需要是以前的约束)。
虽然单元/集成测试对于任何[大规模的]项目来说都是必须的,但我发现一种 * 静态类型语言 *(C#/F#)可以 * 大大减少 * 与类型相关的“愚蠢的bug”的数量。
打开竞争环境:-)
编辑注解:
那么你只是在比较语言。
在这种情况下,C#是一种非常乏味的命令式静态类型语言,具有基于单继承/接口类的OO(但比Java更巧妙,Java是彻头彻尾的石器时代)这是 * 与Python相同的OO基本类型 ,除了静态/动态部分, 两种语言都是强类型的 *(机制不同,但最终结果在语言谱上相当相似)实际上,Python有MI,但在Python中,“lambda”关键字的使用似乎不太被接受,并且由于Python是动态类型的,因此没有用于确定接口/类型契约的编译时支持(然而,有一些模块试图提供这一点)。
**如果你能学习/了解Python,那么你就能学习/了解C#。**这不是一个范式转变。这里有些关键字,那里有大括号,需要说明你在那里指的是什么类型,不同的基本库...不同的环境(你必须争取一些才能得到REPL,但在VS中是可行的。)开发人员如何喜欢/学习/使用它是另一回事。虽然我以前确实称C#为命令式,很高兴看到添加了一些“类似函数”的特性,如LINQ/IEnumerable扩展和没有委托的闭包,即使基本的C#语法非常程序化--再一次,非常类似于python(for表达式、嵌套函数、语句/表达式划分)。
虽然新的“动态”确实模糊了界限(很少有好的用法--在以前的C#版本中,在几乎所有相同的地方,人们可能不得不退回到反射--这是不正确的,但关键是它通常是“错误的方式”,除了在少数情况下,它恰好是“最好的/唯一的方式”),'var'不是。“var”变量的类型 * 在编译时已知 * 并且 * 与动态类型无关 ;有些语言,如F#/SML和Haskell,有非常非常强大的类型推理,不需要“所有那些丑陋的类型声明”(尽管显式注解允许的类型或类型集可以使意图更清楚),同时保留静态类型。
就我个人而言, 抛开其他不谈 *,我会使用静态类型语言。(我绝对不是说Java!),但是静态类型语言可能会将类型错误推到最前面,并需要预先的显式契约(这对我来说是一个很大很大的胜利)。虽然你确实错过了一些整洁的动态技巧,在目标语言中几乎总是有更好的方法来执行相同的操作--您只需要从语言的Angular 来考虑,用螺丝刀来拧螺丝,用锤子来敲钉子。(ab)使用local()或global()直接转换为C#。
在“缺点”方面,大多数静态类型语言(此处为C#)需要显式编译优先(但这并不坏,因为它可以生成漂亮的程序集),而且像“REPL”这样的工具并不被视为一等公民(它是F#/VS2010中的一等公民)。此外,如果您有Python/C#的基本库(并且它在另一种语言中不可用),这可能是为什么选择一种语言而不是另一种语言的决定性因素。
xzlaal3s2#
我在Quora上写了一个非常全面的回答:How does Python compare to C#?
靶病变; DR
gkn4icbw3#
我还建议我们必须比较运行时,而不是局限于语言特性。Python通过解释器CPython运行,而C#在默认实现中运行在CLR上。
多任务处理在任何大型项目中都是非常重要的; NET可以通过线程轻松地处理这个问题......而且它还可以利用IIS(ASP.NET)中的工作进程。CPython不提供真正的线程功能,因为GIL......每个线程在执行任何代码之前都必须获得一个锁,对于真正的多任务处理,您必须使用多个进程。
当我们在IIS上的单个工作进程上托管ASP.NET应用程序时,ASP.NET仍然可以利用线程在不同的内核上同时服务多个Web请求,而CPython依赖于多个工作进程在不同的内核上实现并行计算。
所有这一切都引出了一个大问题,我们如何在Windows上托管Python/Django应用。我们都知道在Windows上分叉进程比Linux上要昂贵得多。所以理想的情况是托管Python/Django应用;最好的环境是Linux而不是Windows。
如果您选择Python,那么开发和托管Python的正确环境应该是Linux...如果您像我一样来自Windows,那么选择Python也会引入新的Linux学习曲线...尽管现在并不困难...
laximzn54#
业界的主要问题是python的动态特性,因为静态类型语言有某种安全性。
但是现在我们有了现代的IDE,比如PyCharm,它们集成了pylint和pep8的“代码检查”和“样式指南检查”功能,当你输入代码时,这就消除了最愚蠢的错误,所以你现在在python中几乎拥有了同样的安全性。
另一件事是,如果你需要“静态类型检查”,那就在你需要的时候自己去做,这就是python实用主义的本质。
GIL是一个问题,但是你可以使用gevent或者ZMQ来做一种线程,但是在PyPy STM上的工作正在进行中。
Python几乎可以在任何地方运行,你可以选择不同的、大多数兼容的运行时(Wikipedia上有12个)Wikipedia python解释器列表