2010-08-06 493 views
49

Actualmente, mi organización ofrece una aplicación web basada principalmente en un servidor SQL Server 2005/2008, un marco de modelos/controladores Java y vistas basadas en ColdFusion. Hemos decidido hacer la transición a un marco más nuevo y luego de que las exploraciones internas y los mini proyectos redujeron la elección entre Python y C# /. NET.Python vs C# /. NET: ¿cuáles son las principales diferencias a considerar para usar una para desarrollar una aplicación web grande?

Permítanme comenzar diciendo que Me doy cuenta de que cualquiera de las tecnologías funcionará de maravilla, y estoy buscando los diferenciadores de teclas (y los pros y contras asociados) Estos lenguajes tienen mucho en común, y mucho no - Yo Estoy buscando su opinión sobre sus diferencias clave.

Ejemplo compensación/diferenciador Busco:

Si bien parece que se puede lograr más con menos código y ser más creativos con Python, ya que .NET es más estructurado que puede ser más fácil para hacerse cargo de la comprensión y modificando el código que alguien más escribió.

Parte de la información adicional que puede ser útil:

Nuestro equipo de ingeniería es de aproximadamente 20 grandes y que trabajan en pequeños grupos de 5-7 de los cuales hacemos girar la gente dentro y fuera con frecuencia. Trabajamos en código que alguien más escribió tanto como escribimos código nuevo.

Con python iríamos por la ruta de Django, y con .NET iríamos con MVC2. Nuestros servidores son servidores de Windows que ejecutan IIS.

Algunas de las cosas que nos gustan de ColdFusion incluyen que es muy fácil trabajar con consultas y que podemos implementar arreglos "en caliente" en nuestros servidores web sin tener que reiniciarlos o interrumpir a nadie en ellos.


He leído algunos de los otros X vs Y las discusiones que implican estas dos lenguas y parecieron muy útiles, pero me gustaría poner pitón de cabeza a cabeza contra .Net directamente. ¡Gracias de antemano por permitirme aprovechar sus experiencias para esta difícil pregunta!

+0

¿Está desarrollando un sitio web o una aplicación web? Porque creo que las herramientas como GWT son mucho más adecuadas para "aplicaciones". –

+0

Gracias por la sugerencia Matt! Estamos desarrollando una aplicación web con ajax, procesamiento asincrónico, etc. Por ejemplo, los usuarios ingresan algunas configuraciones para poner en cola operaciones intensas computacionalmente (que luego implican consultar las tablas en el DB) y comienzan a correr con los resultados presentados a medida que están disponibles . Hay muchas, muchas páginas diferentes, widgets, etc. Es cierto que no invertimos demasiado tiempo en explorar GWT, ya que es muy similar a lo que tenemos actualmente. En este punto, estamos buscando avanzar y estamos enfocados en Python vs.Net – Zugwalt

+1

".NET" no es un idioma. Tal vez sea Python vs. C# o Python/Django vs C#/ASP.NET (o elija cualquier "webwork" que desee, hay muchas, muchas soluciones diferentes para Python y ".NET") - Hay IronPython [http: //ironpython.net/] (Python "en .NET") –

Respuesta

35

".NET" no es un idioma. Tal vez sea Python vs. C# o Python/Django vs C#/ASP.NET (o elija cualquier "webwork" que desee; hay muchas, muchas soluciones diferentes para Python y ".NET" y para elegir Django o MVC2 del bate) limitar severamente mejores opciones viables). Como en contra de la Python vs" .NET ': Hay IronPython (Python 'en .NET')

yo consideraría: desarrollador comodidad con un lenguaje y, si son iguales en Python y'. NET ", entonces consideraría los tiempos de respuesta para el desarrollo y elegiría el idioma /" webwork "que minimizara esto (una vez más, no tiene que ser restricciones previas).

Mientras la unidad/integración de pruebas es una necesidad para cualquier proyecto [importante], considero que un lenguaje de tipos estáticos (C#/F #) puede reducir en gran medida el número de "estúpidos errores" relativos a los tipos.

abrir el campo de juego :-)

Editar para hacer comentarios:

idiomas Entonces usted está comparando.

En cuyo caso, C# es un lenguaje tónico estático imperativo muy aburrido con Single-Inheritance/Interface Class-Based OO (pero unos pocos trucos más que Java, que es francamente stone-age). Esto es el mismo tipo básico de OO que Python tiene y excluye el bit estático/dinámico, ambos idiomas están fuertemente tipados (la mecánica es diferente, pero el resultado final es bastante similar en el espectro de idioma). En realidad, python tiene MI, pero parece menos aceptado en python que el uso de la palabra clave 'lambda' y dado que python está tipeado dinámicamente, no hay soporte en tiempo de compilación para determinar contratos de interfaz/tipo (hay, sin embargo, algunos módulos que trata de proporcionar esto).

Si puede aprender/conocer Python, entonces puede aprender/conocer C#. No es un cambio de paradigma. Algunas palabras clave aquí, llaves ahí, necesitan decir de qué tipo te refieres, una biblioteca base diferente ... un entorno diferente (tienes que luchar contra algunos para obtener un REPL, pero es factible en VS.) Cómo les gusta/aprende usarlo es otra historia. Mientras antes llamaba al imperativo de C#, es agradable ver la adición de algunas características "funcionales" como extensiones LINQ/IEnumerables y cierres sin delegados, incluso si la sintaxis básica de C# es muy procesal, una vez más, bastante al igual que python (para-expresiones, funciones anidadas, división de declaración/expresión).

Si bien la nueva 'dinámica' hace difuminar la línea (hay muy pocas veces un buen uso para él - en cerca de todos los mismos lugares uno podría haber tenido que recurrir a la reflexión en las versiones anteriores de C# - esto no es' t cierto, pero el punto es que generalmente es "la manera incorrecta", excepto en los pocos casos en los que simplemente resulta ser "la mejor/única manera"), "var" no. Es decir, el tipo de variable 'var' es conocido en tiempo de compilación y no tiene nada que ver con el tipado dinámico; es todo tipo de inferencia. Algunos lenguajes como F #/SML y Haskell tienen mucha, mucho más poderosa inferencia de tipo eliminando la necesidad de "todas esas declaraciones de tipo feo" (aunque anotar explícitamente los tipos o conjuntos permitidos puede hacer que el intento sea más claro) mientras se preserva el tipado estático.

Personalmente, todo a un lado, yo usaría un lenguaje de tipos estáticos. No digo C# (¡y definitivamente no digo Java!), Pero los lenguajes tipados estáticos pueden empujar los errores de tipo a la parte superior y requieren contratos explícitos por adelantado (esta es una gran, gran ganancia para mí). Si bien te pierdes algunos trucos dinámicos, casi siempre hay una mejor manera de realizar la misma acción en el idioma de destino: solo tienes que pensar en términos de ese idioma y usar un destornillador para un tornillo y un martillo para una uña. P.ej. no espere traer el código de Python confiando en el uso (ab) de local() o global() en C# tal como está.

En el "lado negativo", la mayoría de los lenguajes estáticos (C# aquí) requieren una compilación explícita primero (pero esto no es tan malo ya que hace ensamblajes bonitos) y herramientas como "REPL" no son tomados como ciudadanos de primera clase (es un ciudadano de primera clase en F #/VS2010). Además, si tiene una biblioteca esencial para Python/C# (y no está disponible en el otro idioma), ese puede ser un factor decisivo sobre por qué elegir un idioma sobre el otro.

+0

Aunque odiaría limitarnos a nosotros mismos Django o MCV2 es donde comenzaríamos ya que tenemos que comenzar en algún lado. La comodidad del desarrollador es lo que trato de sentir al entender las diferencias clave. Por ejemplo, tipado estático vs tipado dinámicamente es una diferencia clave, y luego hay cosas como la var y dinámica de C# para difuminar la línea un poco. – Zugwalt

+19

En realidad, la var de C# no es dinámica, AFAIK, el tipo var se determina en tiempo de compilación, no en tiempo de ejecución, y luego tiene todas las cosas buenas como intellisense y verificación de errores cuando está codificando. En otras palabras, "int number = 5" y "var number = 5" se compilarán con el mismo código intermedio. –

+0

Excelente respuesta e información, gracias – Flash

25

escribí una respuesta muy completa sobre Quora en esto: How does Python compare to C#?

TL; DR

  • La respuesta es enorme, pero (con suerte) bastante completo. Programé en C#/.NET por casi 10 años, así que lo sé muy bien. Y programo en Python en Quora durante ~ 7 meses, así que espero saberlo bastante bien.

  • Python es ganador en: facilidad de aprendizaje, desarrollo de plataforma cruzada, la disponibilidad de librerías de código abierto

  • C# es ganador en: biblioteca estándar, las características del lenguaje, proceso de desarrollo y herramientas, el rendimiento, el lenguaje velocidad de evolución
  • Aproximadamente par: sintaxis (Python es mejor en legibilidad, C# tiene sintaxis más consistente), adopción.
+18

¿Por qué no publicar la respuesta real aquí? – Den

+1

@Den porque es una respuesta muy larga – alwbtc

+3

Disculpe, solo solucioné el enlace; ahora no es necesario que inicie sesión. –

6

También sugeriría hay que comparar los tiempos de ejecución y no limitar a las características del lenguaje antes de hacer este tipo de movimientos. Python se ejecuta a través del intérprete CPython, donde C# se ejecuta en CLR en sus implementaciones predeterminadas.

La multitarea es muy importante en cualquier proyecto a gran escala; .NET puede manejar esto fácilmente a través de hilos ... y también puede aprovechar los beneficios de los procesos de trabajo en IIS (ASP.NET). CPython no ofrece capacidades de subprocesamiento real debido a GIL ... un bloqueo que cada subproceso tiene que adquirir antes de ejecutar cualquier código, para la verdadera multitarea debe usar múltiples procesos.

Cuando alojamos aplicaciones ASP.NET en IIS en procesos de trabajo único, ASP.NET aún puede aprovechar el enhebrado para atender múltiples solicitudes web simultáneamente en diferentes núcleos donde CPython depende de múltiples procesos de trabajo para lograr computación paralela en diferentes núcleos .

Todo esto lleva a una gran pregunta, ¿cómo vamos a alojar la aplicación Python/Django en Windows. Todos sabemos que el proceso de bifurcación en Windows es mucho más costoso que Linux. Así que idealmente para alojar la aplicación Python/Django; el mejor entorno sería Linux en lugar de Windows.

Si elige Python, el entorno adecuado para desarrollarse y anfitrión Python sería Linux ... y si eres como yo, procedente de las ventanas, la elección de Python introduciría nueva curva de aprendizaje de Linux, así ... aunque no es muy difícil en estos días ...

2

El principal problema en industrie es la naturaleza dinámica de python. Porque tiene algún tipo de seguridad con un lenguaje estático.

Pero ahora tenemos IDE modernos como PyCharm. Integran pylint y pep8 "comprobación de código" y "styleguide-check" cuando ingresas tu código. Eso elimina los errores más estúpidos. Entonces casi tienes la misma seguridad en Python ahora.

La otra cosa es, si necesita "comprobación de tipo estático" hágalo usted mismo cuando lo necesite. Esa es la naturaleza pragmática de Python.

GIL es un problema, pero puedes usar gevent o ZMQ para hacer un tipo de subprocesamiento. Pero trabajo en progreso en PyPy STM.

Python funciona en casi cualquier lugar y usted tiene la opción de diversos, en su mayoría compatibles, tiempos de ejecución (12 en la Wikipedia) Wikipedia python interpreter list

Cuestiones relacionadas