Recientemente vi a alguien comparando Python, Shell script y C++ en Internet, hablando principalmente sobre el rendimiento de Python. Personalmente no creo que tenga mucho sentido.
¿Cuáles son los problemas de rendimiento en un idioma? Lo que determina todo es la implementación detrás de esto (biblioteca estándar, compilador), al igual que siempre hay personas que quieren comparar la eficiencia de c++ y c.
Es más, a Python siempre se le ha llamado lenguaje de scripting. De hecho, un script se refiere a un archivo de comandos por lotes, que es una colección de comandos de shell, completamente similar a Python.
No al mismo nivel. Diferentes herramientas tienen diferentes niveles y son aplicables a diferentes problemas. Comparar cosas en diferentes niveles no significa mucho.
Además, Shell conoce la bifurcación. ¿Qué crees que puede hacer? :-).
Primero digamos tonterías y luego analicemos el rendimiento de Python con ejemplos.
En primer lugar, Python es un lenguaje de programación dinámico y su principal atractivo es que puede mejorar la eficiencia del desarrollo de aplicaciones. Lo mismo que Java, Perl, Ruby y otros lenguajes.
Es una poderosa herramienta para la integración de sistemas, aplicaciones web y otros sistemas. También es un tema popular en el campo de la informática científica en los últimos años.
Básicamente no son herramientas de desarrollo del mismo nivel que C/Cplusplus, son sistemas subyacentes (la biblioteca básica, el sistema operativo y los ecos están escritos en C++ o se usan en sistemas integrados),
Muchas bibliotecas proporcionan funcionalidad básica. Sin embargo, puede escribir módulos C o cpp para Python para mejorar el rendimiento general de su sistema Python.
En segundo lugar, el intérprete principal de Python, CPython, está implementado en lenguaje C, y los algoritmos implementados por diferentes tipos (dict) y funciones varían mucho. Si su sistema es sensible al rendimiento,
debe saber algunas cosas. Las funciones con diferentes parámetros pueden tener un rendimiento muy diferente. Además, cuando el intérprete de Python ejecuta código Python, puede pasar por las siguientes etapas:
1) Cargar el archivo de código 2) Traducir a AST 3) Generar código de bytes 4) En la PVM (máquina virtual Python) La ejecución de código de bytes en él es en realidad una máquina virtual basada en pila.
La cantidad de código de archivo en las primeras tres etapas generalmente se consume en el nivel de ms. Si no quiere desperdiciarlo, puede usar el comando python -O -m py_compile xx.py.
Primero compila xx.py en el código de bytes de xx.pyo y luego ejecútalo. PVM llama a python xx.pyo. Simplemente puede considerarlo como una función escrita en lenguaje C con un interruptor muy grande.
Realiza diferentes acciones basadas en diferentes contenidos de códigos de bytes. Por ejemplo, cuando encuentra una instrucción para abrir un archivo, esta función llamará a la función de la biblioteca libc para realizar la operación de apertura del archivo en lenguaje C.
De hecho, la diferencia de rendimiento entre el código de bytes de Python y el lenguaje C es muy pequeña, porque muchos módulos funcionales de Python ejecutan directamente la biblioteca C.
En tercer lugar, con la aplicación generalizada de Python, el problema de rendimiento del intérprete CPython se está volviendo cada vez más grave, especialmente en los campos de la minería de datos y el aprendizaje automático, donde se han implementado muchas herramientas excelentes.
Todo está hecho en Python. Para resolver este problema, la comunidad de Python ha propuesto varios intérpretes, como numba para cálculos numéricos, pypy, el intérprete de Python implementado en Python, etc.
Su objetivo principal es mejorar la velocidad de Python, utilizando tecnologías como JIT y LLVM. Por ejemplo, numba proporciona un nuevo decorador para Python que permite ejecutar funciones de Python en tiempo de ejecución.
Traducido a código máquina mediante la biblioteca llvm. El objetivo principal de CPython ahora es convertirse en un modelo para intérpretes de Python, es decir, proporcionar una referencia de implementación de intérpretes estable, confiable y más completa.
Además, si el rendimiento de un determinado módulo funcional implementado en Python es crítico, primero puede usar Cython para traducir el módulo al código de lenguaje C y luego compilarlo en un programa ejecutable.
Por supuesto que es Cython.
También puede llamar a bibliotecas C externas de manera más conveniente en Python para garantizar el rendimiento de todo el sistema. Por lo tanto, la velocidad de ejecución de muchos sistemas Python será cada vez más rápida, pero no es que Python sea rápido, sino el soporte detrás de él.
Cada vez más fuertes.
Finalmente, Python es un lenguaje similar a Java. No lo consideres un guión. Al principio lo entendí como un script, probablemente porque Python proporciona una herramienta de línea de comando para que la gente ingrese.
Codifica en Python y observa los resultados inmediatamente. De hecho, esta es sólo una de las excelentes herramientas que proporciona Python. Python se utiliza cada vez más en diversos campos y cada vez hay más recursos de código abierto:
1. Disco informático distribuido a gran escala, que proporciona un modelo mapreduce similar a hadoop: http://discoprojec t.o rg /
2. Computación/visualización científica numpy, scipy, matplotlib
3. Minería de datos naranja, kit de herramientas científicas, kit de herramientas para aprender. sourceforge e.n et
4. Proyecto Django de desarrollo de redes
Python se puede encontrar en todos los campos de TI.
Dicho esto, un ejemplo de procesamiento de texto es calcular la suma de los datos en la tercera columna de texto. Echemos un vistazo a las habilidades de Python, especialmente los problemas de rendimiento.
La referencia de comparación es el artefacto awk. De hecho, no es justo comparar awk. Después de todo, awk es una herramienta de optimización y reoptimización (supongo que no hay ningún incentivo para verla implementada :).
Yo mismo debería escribir una versión C.
El archivo de muestra tiene más de 654,38 millones de líneas y el formato es el siguiente:
data.txt:
d0 sp 0
d1 paso 1
d2 paso 2
d3 paso 3
d4 paso 4
d5 paso 5
d6 sp 6
d7 sp 7
d8 sp 8
d9 sp 9
Primero mira los resultados de awk: p>
$ tiempo gato datos .txt | awk "{ suma+= $ 3 } FIN { imprimir suma }"
49976634308700
Real 0 metros cúbicos 662 segundos
Usuario 0m3.576s
Sistema 0m0.240s
100.000 filas en 3 segundos, la eficiencia es realmente alta.
Mirando a Python, hice cuatro versiones.
Versión de código Python (1):
Sistema de importación
def data_sum().
datasum = 0
Para líneas en sys.stdin:
raw = line.split()
datasum += int ( raw[2], 10)
Imprimir resumen de datos
if __name__ == "__main__ ":
data_sum()
Python versión del código (2):
Sistema de importación
def data_sum().
datasum = 0
Para líneas en sys.stdin:
raw = line.split()
datasum += int ( raw[2])
Imprimir resumen de datos
if __name__ == "__main__ ":
data_sum()
Versión del código Python (3):
def suma_datos().
datasum = 0
Para la línea en sys.stdin:
datasum += int('2 ', 10)
Imprimir resumen de datos
if __name__ == "__main__ ":
data_sum()
Versión del código Python (4):
Importar Sistema
def data_sum().
datasum = 0
Para líneas en sys.stdin:
raw = line.split()
Imprimir resumen de datos
p>if __name__ == "__main__ ":
data_sum()
Resultados de la implementación de la versión (1):
Primero, convierta el código Python Compile en código de bytes y ejecútelo.
$ python-O-m py _ compilar suma de datos .py
$ tiempo gato txt | python suma de datos
49976634308700
real 0m 7.151s
Usuario 0m7.088s
sys 0m 0.192s
Intenta ejecutar el código Python directamente nuevamente.
$ tiempo gato datos .txt | python datasum py
49976634308700
Real 0m7.323s
Usuario 0m7.228s
p>sys 0m 0.212s
La diferencia entre los dos métodos es aproximadamente un milisegundo, que se consume principalmente en la etapa en la que cpython traduce el código python a ast. Si está interesado, puede escribir una verificación cpython usted mismo.
También está pypy, mira cómo funciona su JIT y su stackless.
$ tiempo gato datos .txt | pypypy-c suma de datos py
49976634308700
Real 0m 4.649 segundos
Usuario 556s.
sys 0m0.224s
¿El bateador sale 1 segundo más lento que la versión awk? Ya estoy muy satisfecho. Probemos otras versiones para ver dónde Python es lento.
Versión (2):
$ tiempo gato datos .txt | python datasum py
49976634308700
real 0m 9.111s<. /p>
Usuario 0m9.025s
sys 0m0.220s
$ tiempo cat data .txt | pypypy-c datasum py
49976634308700<. /p>
Real 0m4.694s
Usuario 0m4.588s
sys 0m0.248s
La versión (2) es directamente mejor que la versión (1 ) 2 segundos más lento. Sólo se requiere un parámetro básico y comprenderá por qué si observa el código de Cpython (Python/bltinmodule.c).
Agrega base y llama directamente:, y finalmente llega a PyOS_strtol.
Versión (3):
$ tiempo gato datos .txt | python datasum py
20000000
Real 0m3.127s<. /p>
Usuario 0m3.044s
sys 0m 0.188s
$ tiempo cat data .txt | pypypy-c datasum py
20000000<. /p>
Real 0 m2 393 segundos
Usuario 0m2.320s
sys 0m 0.196s
Versión (4):
$ tiempo gato datos .txt | python datasum py
Real 0m3.920s
Usuario 0m3.852s
sys 0m 0.180s
$ tiempo gato datos .txt | pypypy -c datasum py
Real 0m3.324s
Usuario 0m3.208s
Sistema 0m0. /p>
Al comparar la versión (3) y la versión (4), podemos encontrar que Python es principalmente lento en la función de división, que consiste en extraer la tercera columna.
A primera vista, parece que usar el lenguaje C puede ser más rápido, pero no esperaba que hubiera una buena manera de usar Python y las expresiones regulares serían más lentas.
El código anterior se ejecuta utilizando el intérprete de Python. Usemos Cython para compilar la versión (1) en lenguaje C y veamos cómo funciona:
$ cy thon-embed-o datasum py
$ gcc-o datasum. suma de datos . c-I/usr/include/python 2.7-lpython 2.7
$ tiempo gato datos.txt |. /datasum
49976634308700
Real 0m6.332s
Usuario 0m6.272s
sys 0m 0.192s
Todavía un poco más lento que pypy. Pypy tiene algunas optimizaciones en la generación de código y cython básicamente traduce.
En resumen:
Python es un arma para la creación rápida de prototipos. Si tiene necesidades de rendimiento, utilice sus diversas funciones para optimizarlo. Python no te defraudará.
Cuando su líder/cliente le presiona mucho con los plazos, Python es la gota que le salva la vida, jaja.
Por supuesto, algunas funciones simples, como los ejemplos de este artículo, se pueden completar usando awk. ¿Por qué molestarse en optimizar Python? :-).