¿Cómo pueden permitirse algunos servicios realmente grandes (como Dropbox) utilizar Python como idioma principal, si es de uno a dos órdenes de magnitud más lento que otros lenguajes compilados?

Pregunta realmente interesante, y la respuesta del Director de Ingeniería de Dropbox realmente debería considerarse algo definitiva.

Dicho esto, permítanme explorar un poco la pregunta porque va al corazón de las aplicaciones de hiperescala.

Las aplicaciones de hiperescala son aplicaciones que sirven a millones de usuarios.

La pregunta que debe hacerse es esta: ¿cuánto cuesta un solo usuario en términos de ciclos de cómputo en los ciclos de cómputo pico?

Y aquí está la respuesta perversa: no mucho. De hecho, si haces los cálculos, probablemente salga en centavos fraccionales. En Zynga hicimos los cálculos en 2011 y descubrimos que el costo por usuario era inferior a 0.1 centavos. Me sorprendería y encantaría que otro proveedor compartiera sus datos, pero dudo que alguien lo haga.

Resultado sorprendente

Qué significa eso?

Significa que los costos de CPU de un solo hilo para un solo usuario son pequeños; los costos solo importan a escala. Y si solo importan a escala, la pregunta se convierte en “¿Cómo pago la escala?”

La respuesta mejor y más optimista es que el usuario final pagará lo suficiente para sufragar los costos. Y supongo que Dropbox ha resuelto ese problema 🙂

Y resulta que una pequeña cantidad de usuarios tiene que pagar una pequeña cantidad para cubrir los costos de la infraestructura.

Si ese es el caso, entonces el costo de rendimiento de Python solo aumenta el número de usuarios que tienen que pagar para cubrir los costos de la infraestructura.
Y si los usuarios que tienen que pagar para alcanzar el punto de equilibrio es realmente pequeño desde una perspectiva de infraestructura pura, y usted ya tiene más que suficiente, entonces esta no es una optimización interesante.

Hagamos algo de aritmética para que el último párrafo sea menos claro:

cost_per_user = $ 0.001
total_users = 1000
infra_cost = $ 1

¿Cuánto tiene que pagar un solo usuario para cumplir con infra_costs?
$ 1

Entonces, siempre y cuando una persona pague $ 1, entonces no le importa que Python sea lento desde una perspectiva de costo puro. Tiene suficiente efectivo para ejecutar su infraestructura.

Ahora, obviamente, este es un ejemplo trivial, y supone un modelo de monetización muy pobre. Una compañía como Dropbox probablemente tiene más del 0.1% de sus usuarios pagando por el almacenamiento y, por lo tanto, los ingresos que generan son mucho más que los costos de la infraestructura.

Y eso me lleva al margen. Resulta que los costos solo importan, ya que afectan su modelo de negocio. Suponiendo que Dropbox es un negocio bien administrado, y eso se siente razonable, espero que el costo de su infraestructura sea pequeño en comparación con las ventas, el marketing y la ingeniería. Y cuanto más barata sea la infraestructura, más dinero tendrá que gastar en esas otras actividades.

Esta es una de esas situaciones de Navaja de afeitar de Occam.

Hagamos algo de aritmética para aclarar mi punto

Suponga que los ingresos totales = $ 100
Costo de ingeniería = $ 30
Infra = $ 1
Ventas + Marketing = $ 30

Si pudiera ahorrar el 50% de sus costos de Infraestructura yendo a C, eso reduciría sus costos totales en $ 0.50

Pero esos ahorros vendrían a expensas de la productividad de la ingeniería, presumiblemente es más fácil desarrollar características con Python. La disminución en la productividad de la ingeniería se traduciría en una disminución en la velocidad de la característica o en un aumento en los costos de ingeniería. En la práctica, realmente se traduce en una disminución en la velocidad de la característica.

Si desde una perspectiva comercial necesita más funciones en lugar de una infraestructura más barata, eso es una mala compensación.

Y esto me lleva al siguiente punto. Dadas las ganancias de productividad de Python y los costos reales de pasar a C, una mejor pregunta es esta: ¿Dropbox utiliza algún tipo de JIT para Python? Esto es lo que hicieron las personas muy inteligentes en Facebook. Frente a los costos de PHP desde el punto de vista de la infraestructura, en lugar de pasar a C, hicieron que PHP fuera mucho, mucho más rápido.

Usar un lenguaje que no sea C siempre es una buena solución para aplicaciones de hiperescala si puede hacer que un pequeño número de personas pague. Y hacer que los lenguajes dinámicos vayan más rápido siempre es una mejor respuesta que pasar a C en estos entornos.

(La mayoría) de las aplicaciones no alcanzan los límites de CPU, los límites de disco o cualquier otro límite físico de una sola máquina con mucha facilidad. Lo primero que tendrá que enfrentar será una limitación de recursos de red.

Si su tiempo de procesamiento es 0.001 ms, y su tiempo de acceso a la base de datos es 10 ms, ¿cuál cree que es más importante? ¿Optimizando el tiempo de acceso al idioma para que sea 0.0001 ms, o encontrando una mejor manera de lidiar con otros recursos?

Python es magnitudes más lentas que los lenguajes compilados, pero esto solo es importante para las aplicaciones vinculadas a la CPU.

Dropbox está vinculado al disco y a la red. Como resultado, el uso de un lenguaje compilado no aceleraría Dropbox ya que la mayor parte del tiempo se pasa leyendo / escribiendo datos en lugar de calcular datos.

La principal ventaja de los lenguajes interpretados es la velocidad de desarrollo. Es por eso que la mayoría de los sitios web se desarrollan en idiomas interpretados; los codificadores se benefician de las ventajas mientras que los negativos son marginados.

El argumento es que los beneficios de la velocidad de desarrollo superan en gran medida el tiempo de procesamiento adicional + los costos del servidor, especialmente cuando la empresa es pequeña. Hay muchas nuevas empresas que tendrán una gran optimización de costos desde el principio, pero si son superadas por un competidor que se mueve más rápido, no importa: los parámetros del éxito no importan si la magnitud es cero.

Por lo tanto, no podríamos permitirnos * no * comenzar con Python, diría. En este punto, potencialmente no podemos permitirnos cambiar de Python dado lo mucho que ya hemos escrito en él. Dicho esto, los costos se están sintiendo; hay personas que experimentan con el uso de otros lenguajes (Go, por lo general) para nuevos proyectos, y hay esfuerzos como Pyston para tratar de reducir el costo de Python.

Además, no creo que sea correcto decir “Dropbox está obligado a IO”. Cualquier solicitud particular puede estar vinculada a IO, pero si ese es el caso, simplemente active la concurrencia hasta que el servidor en su conjunto esté en la utilización de destino en alguna métrica. Para algunos servicios que terminarán siendo ancho de banda de red o disco IO, pero para muchos es CPU. Entonces, en cualquier momento, Dropbox tiene una gran cantidad de núcleos que ejecutan código Python.

Una aplicación web escrita en C no será sustancialmente más rápida que una escrita en Python. Sus cuellos de botella están en la capa de datos, como redis, memcached, solr, postgress.

El bit intensivo de CPU (para la mayoría de las aplicaciones) no está en la capa web.

YouTube, DropBox, Instagram, Spotify, TheOnion, WashingtonPost, Reddit, Yahoo Maps, NASA, PBS e incluso Quora son ejemplos de sitios web que usan Python. Así que no, no diría que es demasiado lento para usarlo para el desarrollo web.

También hay muchos sitios web exitosos, de alto rendimiento y de gran escala escritos en Java, PHP, Ruby, .NET, Perl, ColdFusion, Javascript, y casi cualquier otra cosa que se te ocurra. Si tiene problemas de rendimiento, no es por el idioma.

Como he dicho antes, “La tecnología no te da rendimiento. La arquitectura es lo que te da rendimiento”.

# 1 razón: Dropbox probablemente quema la mayor parte del tiempo de CPU esperando E / S (E / S de disco, E / S de red o E / S de base de datos). El procesamiento de números de CPU importa menos para esta aplicación. La cifra de 2 órdenes de magnitud que usted dice es más aplicable al comparar una implementación de algoritmo de cálculo de números en C ++ frente a una implementación de Ruby.

# 2 razón: la productividad importa. Y compilar / interpretar no necesariamente implica “productivo”. Solía ​​ser una vez, ya no. Para más detalles, mire abajo donde cubro las cuatro permutaciones de “productivo-improductivo versus compilado-interpretado”.

Detalles:
======
Compilado + productivo: C # está compilado (casi; a CIL similar a Java en diseño) y rendimiento en cerca de C ++. Pero aún es extremadamente productivo y el framework (.NET) es ridículamente bueno. Con la palabra clave “dinámica” de C # v4, obtiene ventajas de la escritura dinámica (para esa sección de código): en mi humilde opinión, es lo mejor de ambos mundos, y ahora tengo preferencia por ASP.NET .MVC (basado en C #) sobre Django (basado en Python )

Interpretado + productivo: Python y Ruby se interpretan y también son muy productivos. Personalmente, también me gusta Python. Python + Django es como una versión interpretada de ASP.NET MVC4 (basada en C #), por lo que esa combinación también es muy productiva.

Compilado + improductivo (en un entorno web): tome C o C ++. Te encontrarás reinventando la rueda para que sea muy útil en un entorno web; algo que el mundo C #, Ruby o Python ya hace por ti. Hay un framework CppCMS – High Performance C ++ Web Framework (como Django o ASP.NET MVC), pero realmente no lo he probado, y no puedo hablar de sus reclamos de productividad.

Interpretado + improductivo (en un entorno web): aunque he programado desde bits de código de máquina en EPROM para ensamblar a C a Python / C #; No me he molestado demasiado con los idiomas improductivos interpretados. Pero algo como Perl (¡de 2000!) Con sus URI ‘cgi-bin’ probablemente caería en ese territorio.

Creo que las empresas como Dropbox, que ya están en la etapa en la que tienen una empresa e infraestructura en funcionamiento, ahora deberían centrarse en ser eficientes.

Mucha gente dice que no importa si Dropbox está construido en Python porque el tiempo de espera principal se desperdicia al esperar la red y la base de datos y que mejorar el demonio no es importante.

Bueno, esto no es exactamente cierto. En mi computadora portátil (macosx), Dropbox es la aplicación que usa más energía, casi siempre usa ambos procesadores a una velocidad del 100% cuando lo estoy codificando, solo intente compilar su proyecto o ejecute su meteorito aplicación, ya verás. O incluso proyectos de Unity. Python y su sistema actual funcionan muy bien para las mamás que editan sus archivos .doc, pero para el resto de nosotros, es extremadamente lento e ineficiente.

Además, al mover proyectos, que normalmente tienen muchos archivos pequeños (no millones pero cerca de mil), Dropbox tardará una eternidad en comenzar a procesarlos y enviarlos. El demonio de “indexación” es extremadamente lento, y consume una tonelada de potencia de procesamiento, enviar archivos 1 por 1 también es extremadamente ineficiente.

Para una startup, creo que la productividad central es el camino a seguir, incluso si el producto es extremadamente lento, pero las empresas deben ser responsables y, una vez establecidas y que pueden permitírselo, moverse y mejorar.

No es que Dropbox haya agregado un montón de características a su proyecto en los últimos 3-4 años, es casi lo mismo.

Me gustaría ver un cliente con rendimiento C ++ para Dropbox con compresión y empaquetado de documentos:

– Comprima varios archivos pequeños juntos, por ejemplo, todos los archivos de menos de 10 kb, comprímalos en paquetes de 1mb y muévalos en paralelo.

– Indexe archivos usando un lenguaje más rápido, usando 100% de CPU más una tonelada de memoria y tomar tanto tiempo es simplemente estúpido, considere agregar sombreadores GPU para procesar esto también, no estaría eliminando sus Bitcoins en su CPU en Python, ¿por qué debería? ¿Lo hace por sus millones de documentos pequeños? (hash para control de versiones de documentos y seguimiento de cambios)

Probablemente recibirá muchas críticas por esto, como normalmente … pero bueno, ya tienen el dinero y los equipos para hacerlo, así que ¿por qué no hacerlo? Deberían ser responsables.

El rendimiento del código es solo una parte del ciclo de vida del software.

Mucho más importante para la mayoría de las empresas es el mantenimiento del código y la facilidad de implementación. Si su código es súper rápido, pero hace lo incorrecto porque nadie puede leerlo y mantenerlo, ¿de qué sirve? Si es súper rápido pero le lleva semanas implementarlo debido a todas las pruebas y los ciclos de control de cambios en las bibliotecas dependientes, ¿de qué sirve?

Otra cosa clave a entender es la cantidad de tiempo que el código pasa esperando … esperando la red, esperando la entrada del usuario … etc. Para una aplicación basada en la web, este tiempo de espera es siempre la pieza más importante del modelo de rendimiento. En consecuencia, ser seguro para subprocesos y tener una buena administración de memoria puede ser mucho más importante que la velocidad pura. Los lenguajes interpretados como Python hacen que la escritura de programas seguros para subprocesos y memoria sea mucho más fácil.

Finalmente … muchos idiomas interpretados tienen muchas opciones de optimización. Los algoritmos o bucles clave pueden compilarse en código nativo y cargarse como bibliotecas, o pueden optimizarse hasta el punto de que el rendimiento sea lo suficientemente cercano al código compilado nativo que no importa.
En el caso de Python, agregar bibliotecas de código nativo es especialmente fácil. También hay un compilador JIT para Python llamado PyPy que parece proporcionar ganancias sustanciales de rendimiento sin cambios de código (o mínimos).

La agilidad empresarial suele ser más importante que el máximo rendimiento teórico.

Puede desarrollar software más rápido en lenguajes más expresivos. El tiempo extra se puede utilizar para ajustar cualquier cosa que sea importante, pero lo más importante es que puede optar por invertir ese tiempo extra para mejorar su producto de otras maneras también.

Tomaría un lenguaje diez veces más lento que, por ejemplo, Ruby, si pudiera desarrollar software cinco veces más rápido.

Hay algunas excepciones a esto, donde el rendimiento realmente importa. En esos casos, dependiendo de la aplicación, puede usar Java o C o Node o lo que sea. Pero para la informática más general, Python o Ruby son a menudo la mejor herramienta para el trabajo.

En realidad, Python ayuda a mejorar su velocidad de desarrollo web y demás.

Python es un lenguaje muy flexible que es fácil de dominar y usar. Esto hace que el desarrollo sea mucho más rápido. Mis estimaciones son que estoy alrededor de 10 veces más productivo con Python en comparación con Ruby, y 100 veces en comparación con Java.

Python también le permite centrarse en qué algoritmo es mejor para un problema en particular. No favorece un algoritmo sobre otro. Esto debería ayudarlo a experimentar con muchos algoritmos diferentes para encontrar el que funcione mejor para su problema particular. A medida que se acerca a los problemas de escala, es bastante fácil cambiar los algoritmos según sea necesario.

El soporte limitado de Python para subprocesos múltiples hace que el programador piense en maneras de abordar el problema desde un enfoque de microhilo o un enfoque de múltiples procesos. Múltiples procesos se mueven fácilmente a otras máquinas, mientras que es más difícil adaptar los hilos para que se ejecuten en diferentes máquinas. Entonces, al favorecer un enfoque multiproceso, realmente se está preparando para una escala infinita. Aquí es importante una palabra sobre el GIL: eliminar el GIL impondría una grave penalización de rendimiento, una penalización que otros idiomas parecen felices de soportar. Esto significa que Python puede ser más rápido que otros idiomas, a pesar de que no tiene un soporte extravagante de subprocesos múltiples en el propio lenguaje.

También tenga en cuenta que la flexibilidad de Python ha llevado a la diversidad de marcos de desarrollo web que existen. Tome algo como SQLAlchemy, por ejemplo, y compárelo con las capas ORM que están escritas para otros idiomas, y verá rápidamente por qué está muy por encima de ellos. Algo así como SQLAlchemy parece que solo es posible en Python. Luego considere cuánto tiempo de desarrollo se ahorra porque SQLAlchemy hace que el desarrollo sea mucho más fácil. ¡Puedes ver por qué es posible una mejora de 10x-100x! Del mismo modo, los marcos web de Python son todos especiales y únicos en su propio aspecto, algo que es posible debido a la flexibilidad del lenguaje.

Tenga en cuenta que el marco que prefiero hoy en día es Pylons. Es un poco viejo y algunos podrían pensar que están desactualizados, pero es simple, hace el trabajo y se mantiene fuera de su camino.

Todo depende de qué problema estés tratando de resolver. ¡No implemente algoritmos de compresión o encriptación en Python puro!

La afirmación de que los programas Python serían una o dos magnitudes más lentas que “otros lenguajes compilados” generalmente no es cierta en la práctica.

Si compara el desarrollo en Python con, por ejemplo, C ++, puede notar que:

  • Logrará una solución de trabajo mucho más rápido en Python.
  • El programa Python será mucho más corto y fácil de leer.
  • El programa Python tiene un acoplamiento mucho más bajo entre los módulos y es más fácil de modificar.
  • Algunas partes de sus soluciones serán más rápidas en Python, porque tiene estructuras de datos y algoritmos estándar que están escritos en C y ajustados cuidadosamente a lo largo de los años.

Esto supone que conoce Python lo suficientemente bien como para usarlo correctamente.

Con respecto a los problemas de rendimiento, podría resultar que:

  • No tenía ninguna, la solución de Python fue lo suficientemente rápida para este problema sin esfuerzos particulares.
  • Sus problemas de rendimiento se deben a un disco o E / S, por lo que un lenguaje más “eficiente” no ayudaría.
  • Su problema de rendimiento se debió principalmente a una mala elección del algoritmo (bucles dentro de bucles dentro de bucles, etc.) y se pudo resolver atacando el problema de una manera diferente. Cambiar el programa fue mucho más fácil en Python. De hecho, esto es muy común. Muchos programas de C ++ y Java son varias magnitudes más lentas de lo que podrían ser, y a menudo son muy difíciles de cambiar, por lo que no se hace.
  • Alguna parte específica de su programa fue un cuello de botella, y usted arregló sus problemas reescribiendo esa parte en C, o usando, por ejemplo, Cython.

Python es un buen “jugador de equipo”, y es un enfoque común comenzar a escribir todo en Python, obviamente usando bibliotecas existentes escritas en C o C ++ según corresponda, por ejemplo, lxml.

A medida que pasa el tiempo, es posible que desee reemplazar algunas partes más lentas del código Python con, por ejemplo, código C ++.

Es muy posible que la necesidad de reemplazar el código rara vez ocurra, pero en sistemas realmente grandes como usted menciona, como Dropbox, puede haber ahorros significativos en energía y hardware al cambiar algunas partes que son críticas para el rendimiento y funcionalmente estables, por ejemplo, C.

Me parece que Google está funcionando así. Usan mucho Python, pero con el tiempo, algunas cosas se reescriben en C ++, etc.

Porque la velocidad del lenguaje en bruto a menudo no importa tanto. En el caso de Dropbox, el software del cliente pasa la mayor parte del tiempo esperando que se carguen bits desde la red o desde el disco. La mayoría de los sitios web grandes pasan su tiempo esperando la base de datos. No puede acelerar el rendimiento de la red o del disco utilizando un lenguaje más rápido.

Las empresas comienzan con lenguajes como Python y PHP para facilitar el desarrollo. Está bien que lo hagan porque solo 1 de cada 100 empresas llega a una etapa en la que comienzan a sentir las desventajas de estos idiomas en términos de escalabilidad. La mayoría de las otras compañías ni siquiera llegan a esa etapa. Una vez que llegue a esa Etapa, es cuestión de profundidad técnica lo que decide si la empresa puede superar ese obstáculo o no.

Estaba pensando lo mismo, pero luego de mucha discusión con amigos, llegué a esta conclusión.
“La elección del lenguaje de programación no depende del mérito del lenguaje, sino que se realiza según la voluntad de la persona que lo dirige”
Lo cual es cierto en gran medida y el otro hecho también es cierto. Pero una cosa es segura es que la velocidad no es el único factor a tener en cuenta al decidir un idioma para implementar.

Tienes cosas como
1. Costo de desarrollo / hosting / mantenimiento
2. Facilidad de contratación de programadores
3. Facilidad de los principales programadores en una plataforma particular.
4. Comercialización
5. Frescura del lenguaje.

que también contribuyen a la elección del idioma.

Python es mucho más rápido de codificar que cualquier otro lenguaje compilado que yo sepa. En el caso de Dropbox, a menudo el tiempo de ingeniería es mucho más costoso que lanzar más máquinas al problema.

Dicho esto, hay situaciones en las que está justificado escribir un fragmento de código en c ++ en lugar de Python, pero generalmente se resuelve encapsulando en el módulo Python.

Vale la pena señalar que la velocidad de una implementación de lenguaje en comparación con otras nunca es constante.
Python, por ejemplo, sufre un gran impacto en el rendimiento contra C en el cálculo de números u otras tareas intensivas de CPU, pero brilla en E / S.
En cualquier caso, cuando se perfila un script o aplicación con bajo rendimiento, el problema generalmente se reduce a unas pocas líneas o una función responsable, por ejemplo, del 80% del tiempo de ejecución.
En este caso, es trivial reescribir este cuello de botella en C, terminando con un script que es “casi” tan rápido como C, que se codificó en 1/3 del tiempo.
Es una buena compensación para una empresa que compite ferozmente contra competidores poderosos al agregar características y soporte todos los días.

Por cierto, Dropbox está trabajando en un compilador justo a tiempo para Python llamado “Pyston”. Se basa en las mismas ideas que impulsan el motor V8 JavaScript y se basa en LLVM.

Primero: No, no es demasiado lento. Python es generalmente más rápido que PHP porque hace que sea más fácil escribir código que funcione bien.

Segundo: el lenguaje que usa no importará mucho para el rendimiento: se trata de cómo usa el idioma. Si utiliza o no operaciones sin bloqueo en los recursos, si realiza llamadas de base de datos eficientes y si realmente sabe cómo usar el idioma con el que está trabajando, determinará qué tan rápido es el código que escribe.

Por último: el rendimiento ni siquiera importa para la mayoría de las cosas que escribes. Mientras no esté cometiendo errores fundamentales en su código, o escribiendo código que va a procesar gigabytes de datos a la vez, probablemente ni siquiera necesite pensar en el rendimiento. Lo que realmente importa es con qué idioma puedes trabajar más rápido. Y esto es solo una economía simple: si le está pagando a un desarrollador profesional ~ 100USD / hora, y una instancia típica de 1 CPU Digital Ocean es solo 0.02USD / hora, entonces una hora extra de trabajo para producir un código más rápido necesita eliminar 7000 CPU-horas de tiempo dedicadas a ejecutar ese código, en el futuro. Si no puede, es más barato simplemente arrojar más CPU al problema.

No. Los sistemas tienen todo tipo de restricciones. Dependiendo de los requisitos de su sistema, Python para la web podría estar bien. Por ejemplo, Dropbox está probablemente más limitado por la velocidad de escritura en el disco que por el rendimiento del lenguaje / CPU. Para la web, la mayoría de las aplicaciones CRUD no están limitadas por la velocidad del lenguaje y Python sería adecuado.

Se trata de tiempo de desarrollo versus tiempo de ejecución.
Muchas aplicaciones solo se ejecutan durante unos segundos y si fueran más rápidas no importaría mucho. Lo importante es el tiempo necesario para construirlos, y aún más importante, para mantenerlos. Entonces, un lenguaje como Python es mejor para estos.
Ruby podría ser una opción aún mejor, depende del tipo de tarea en cuestión y qué bibliotecas o gemas están disponibles.