Categorías
Python

Pensando de forma recursiva en Python

 

Tabla de Contenidos

  • Comparando Idiomas: Python vs C ++
  • Compilación vs Virtual Machine
  • Sintaxis DifferencesWhitespaceBoolean ExpressionsVariables y de PointersComprehensionsPython std :: algoritmos variables
  • espacios en blanco
  • Expresiones booleanas
  • y std Punteros
  • de comprensión
  • de Python: : algoritmos
  • estático vs dinámico TypingStatic TypingDuck TypingTemplatesType Comprobación
  • establecimiento de tipos estáticos
  • Duck Typing
  • plantillas
  • Tipo Comprobación
  • orientada a objetos ProgrammingSimilaritiesDifferencesOperator sobrecargas vs Diferencias Métodos Dunder
  • Similitudes
  • sobrecargas de operadores vs Métodos Dunder
  • memoria ManagementReference Contando basura CollectorGenerational CollectorWhen usted no quiere Garbage Collection
  • de referencia de conteo del colector de basura generacional
  • C ollector
  • cuando no lo hacen ¿Quieres Garbage Collection
  • roscar, multiprocesamiento, y asíncrono IOThreadingMultiprocessingAsync IO
  • Threading de
  • multiprocesamiento
  • asíncrono IO
  • Varios Problemas
  • Resumen: Python vs C ++
  • Conclusión
  • espacios en blanco Variables
  • Expresiones booleanas
  • y std Punteros
  • de comprensión
  • de Python :: algoritmos
  • establecimiento de tipos estáticos
  • Duck Typing
  • plantillas
  • Tipo Comprobación diferencias
  • Similitudes
  • sobrecargas de operadores vs Dunder Contar métodos
  • Referencia colector
  • generacional del colector de basura
  • cuando no lo desea Garbage Collection
  • Threading de
  • multiprocesamiento
  • asíncrono IO

son yo u a ++ desarrollador C comparando Python vs C ++? ¿Está buscando en Python y preguntando lo que todo el alboroto? ¿Se pregunta cómo Python se compara con los conceptos que ya conoce? O tal vez usted tiene una apuesta sobre quién ganaría si bloqueado C ++ y Python en una jaula y dejar que ellos se enfrentarán? ¡Entonces este articulo es para usted!

En este artículo, usted aprenderá acerca de : Diferencias

  • y similitudes cuando se está comparando Python vs C ++
  • Momentos en Python puede ser una mejor opción para un problema y viceversa Recursos
  • a su vez a y cuando usted tiene preguntas mientras que el aprendizaje de Python

Este artículo está dirigido a los desarrolladores de C ++ que están aprendiendo Python. Se asume un conocimiento básico de los dos idiomas y utilizará conceptos desde Python 3.6 y superiores, así como C ++ 11 o posterior. buceo de

Let en la mirada de Python vs C ++! Bono

gratuito: Haga clic aquí para obtener acceso a un capítulo de trucos Python: El libro que te muestra las mejores prácticas de Python con ejemplos sencillos puede aplicar instantáneamente a escribir código más bonito + Pythonic.

Comparando Idiomas: Python vs C ++

frecuentes, encontrará artículos que exaltan las virtudes de un lenguaje de programación sobre otro. Muy a menudo, se delegan en los esfuerzos para promover una lengua mediante la degradación de la otra. Esto no es ese tipo de artículo.

Cuando usted está comparando Python vs C ++, recordar que los dos son herramientas, y ambos tienen usos para diferentes problemas. Piense en la comparación de un martillo y un destornillador. Usted podría utilizar un destornillador para conducir en las uñas, y usted podría utilizar un martillo para la fuerza de tornillos, pero ni experiencia será del todo eficaz.

Usando la herramienta adecuada para el trabajo es importante. En este artículo, usted aprenderá acerca de las características de Python y C ++ que hacen que cada uno de ellos la elección correcta para ciertos tipos de problemas. Por lo tanto, no ver el “vs” en Python vs C ++ en el sentido de “en contra”. Por el contrario, pensar en ella como una comparación.

Compilación vs inicio de la máquina virtual

Vamos con la mayor diferencia cuando se está comparando Python vs C ++. En C ++, se utiliza un compilador que convierte el código fuente en código máquina y produce un archivo ejecutable. El ejecutable es un archivo independiente que luego se puede ejecutar como un programa autónomo:

Este proceso salidas instrucciones reales de la máquina para el procesador y el sistema operativo que está construido para. En este dibujo, que es un programa de Windows. Esto significa que tendrías que volver a compilar el programa por separado para Windows, Mac y Linux:

Es probable que necesita modificar su código C ++ para ejecutarse en los diferentes sistemas.

Python, por el contrario, utiliza un proceso diferente. Ahora, recuerde que se le busca en CPython que es la implementación estándar para el idioma. A menos que usted está haciendo algo especial, este es el pitón que se está ejecutando.

Python se ejecuta cada vez que se ejecuta el programa. Se compila su fuente al igual que el compilador de C ++. La diferencia es que Python compila a código de bytes en lugar de código máquina nativo. Código de bytes es el código de instrucciones nativas para la máquina virtual de Python. Para acelerar las ejecuciones posteriores de su programa, tiendas de Python el código de bytes en archivos .pyc:

Si está utilizando Python 2, a continuación, encontrará estos archivos junto a los archivos .py. Para Python 3, se encuentra en un directorio __pycache__.

El código de bytes generada no se ejecuta de forma nativa en su procesador. En su lugar, es dirigido por la máquina virtual de Python. Esto es similar a la máquina virtual Java o .NET Runtime Environment Común. La ejecución inicial de su código resultará en un paso de compilación. A continuación, el código de bytes será interpretada para ejecutarse en su hardware específico:

Mientras que el programa no se ha cambiado, cada ejecución posterior se saltará el paso de compilación y utilizar el código de bytes previamente compilado de interpretar:

código

Interpretación va a ser más lenta que la ejecución de código nativo directamente en el hardware. Entonces, ¿por qué Python funciona de esa manera? Pues bien, interpretar el código en un medio de máquinas virtuales que sólo las necesidades de la máquina virtual que deberán elaborarse de un sistema operativo específico en un procesador específico. Todo el código Python se ejecuta se pueden ejecutar en cualquier máquina que tenga Python.

Nota: CPython está escrito en C, por lo que puede funcionar en la mayoría de los sistemas que tienen un compilador C.

Otra característica de este soporte multiplataforma que es extensa biblioteca estándar de Python se escribe en el trabajo en todos los sistemas operativos.

Usando pathlib, por ejemplo, se encargará de separadores de ruta para que si estás en Windows, Mac, o Linux. Los desarrolladores de esas bibliotecas pasaron mucho tiempo por lo que es portátil, por lo que no es necesario preocuparse por ello en su programa de Python!

Antes de continuar, vamos a empezar a hacer el seguimiento de un Python vs C ++ tabla de comparación. Y cuando cubra nuevas comparaciones, se añadirán en cursiva:

Ahora que usted ha visto las diferencias en tiempo de ejecución cuando se está comparando Python vs C ++, vamos a profundizar en los detalles de la sintaxis de los lenguajes. Diferencias

sintaxis

Python y C ++ comparten muchas similitudes sintácticas, pero no discutimos algunas áreas vale la pena:

  • espacios en blanco
  • booleanas expresiones variables
  • y punteros de inicio
  • de comprensión

Vamos con el más polémico primera : espacio en blanco. Los espacios en blanco

Lo primero que la mayoría de los desarrolladores de aviso cuando se comparan Python vs C ++ es el “problema de espacio en blanco.” Python usa el espacio en blanco que conduce al alcance marca. Esto significa que el cuerpo de un bloque si u otra estructura similar se indica por el nivel de indentación. C ++ utiliza llaves ({}) para indicar la misma idea.

Mientras que el analizador léxico Python aceptará cualquier espacio en blanco, siempre y cuando eres consistente, PEP8 (la guía de estilo oficial para Python) especifica 4 espacios para cada nivel de sangría. La mayoría de los editores se pueden configurar para hacer esto automáticamente.

Ha habido una enorme cantidad de escritos, gritando y vociferando acerca de las reglas de espacio en blanco de Python ya, así que vamos a saltar más allá de esa cuestión y a otros asuntos.

En lugar de confiar en un marcador léxica similares; al final de cada declaración, Python usa el final de la línea. Si necesita extender una declaración sobre una sola línea, a continuación, puede utilizar la barra invertida (\) para indicar que. (Tenga en cuenta que si usted está dentro de un conjunto de paréntesis, a continuación, no es necesario el carácter de continuación.)

Hay personas que no están conformes a ambos lados de la cuestión de espacio en blanco. Algunos desarrolladores de Python el amor que usted no tiene que escribir los apoyos y puntos y comas. Algunos desarrolladores de C ++ odian la dependencia de formateo. Aprender a ser cómodo con ambos es la mejor opción.

Ahora que ha contemplado el tema de espacio en blanco, vamos a pasar a uno que es un poco menos polémico: expresiones booleanas.

Expresiones booleanas

La forma en que vamos a usar expresiones booleanas cambia ligeramente en Python vs C ++. En C ++, puede utilizar valores numéricos para indicar verdadero o falso, además de la incorporada en valores. Cualquier cosa que se evalúa como 0 se considera falsa, mientras que cualquier otro valor numérico es cierto.

Python tiene un concepto similar, pero se extiende para incluir otros casos. Los fundamentos son bastante similares. Los estados de documentación Python que los siguientes elementos se evalúan a False:

  • Constantes define como falsa: NoneFalse
  • Ninguno
  • False
  • ceros de cualquier tipo numérico: 00.00jDecimal (0) Fracción (0, 1)
  • 0
  • 0,0
  • 0j
  • decimal (0) Fracción
  • (0, 1) secuencias y colecciones vacíos
  • : » () [] {} set () rango (0)
  • »
  • ()
  • []
  • {} conjunto
  • () rango de
  • (0)
  • Ninguno
  • False
  • 0
  • 0,0
  • 0j
  • decimal (0)
  • Fracción (0, 1 )
  • »
  • ()
  • [] {}
  • conjunto
  • () rango de
  • (0)

Todos los demás elementos son ciertas. Esto significa que una lista vacía [] es falsa, mientras que una lista que contiene sólo cero [0] sigue siendo cierto.

mayoría de los objetos será evaluada como verdadera, a menos que el objeto tiene __bool __ () que devuelve Falso o __len __ () que devuelve 0. Esto le permite extender sus clases personalizadas para actuar como expresiones booleanas.

Python tiene algunos ligeros cambios de C ++ en los operadores booleanos también. Para empezar, si y mientras los estados no requieren los paréntesis que rodean como lo hacen en C ++. Los paréntesis pueden ayudar a facilitar la lectura, sin embargo, a fin de utilizar su mejor juicio. operadores

La mayor parte de C ++ booleanas tienen los operadores similares en Python:

La mayoría de los operadores son similares a C ++, pero si quieres repasar que pueden leer los operadores y expresiones en Python. Variables y punteros

Cuando use por primera vez después de escribir Python en C ++, no se podrían dar las variables mucho pensamiento. Parece que en general el trabajo como lo hacen en C ++. Sin embargo, no son lo mismo. Mientras que en C ++ utiliza variables con valores de referencia, en Python utiliza nombres.

Nota: Para esta sección, en la que está buscando en las variables y nombres en Python vs C ++, va a utilizar las variables para C ++ y nombres para Python. En otras partes, los dos se llaman variables .

En primer lugar, vamos a retroceder un poco y tomar una mirada más amplia a modelo de objetos de Python.

En Python, todo es un objeto. Los números se llevan a cabo en los objetos. Los módulos se llevan a cabo en los objetos. Tanto el objeto de una clase y la propia clase son objetos. Las funciones son también objetos:

>>> a_list_object = list()
>>> a_list_object
[]
>>> a_class_object = list
>>> a_class_object

>>> def sayHi(name):
... print(f'Hello, {name}')
...
>>> a_function_object = sayHi
>>> a_function_object

lista de llamadas () crea un nuevo objeto de la lista, que se asigna a a_list_object. Usando el nombre de la lista de clase por sí mismo coloca una etiqueta en el objeto de clase. Puede colocar una nueva etiqueta en función también. Esta es una herramienta potente y, como todas las herramientas de gran alcance, que puede ser peligroso. (Estoy mirando a ti, señor de la motosierra.)

Nota: “Lea, Eval, Imprimir Loop” El código anterior se muestra corriendo en un REPL, lo que significa Este entorno interactivo se utiliza con frecuencia para probar las ideas en Python y otros lenguajes interpretados.

Si escribe pitón en un símbolo del sistema, a continuación, se abrirá una REPL donde se puede empezar a escribir en código y probar cosas por ti mismo!

Volviendo a la discusión de Python vs C ++, nota que este es el comportamiento es diferente de lo que verá en C ++. A diferencia de Python, C ++ tiene variables que se asignan a una posición de memoria, y usted debe indicar la cantidad de memoria que utilizará la variable:

int an_int;
float a_big_array_of_floats[REALLY_BIG_NUMBER];

En Python, todos los objetos se crean en la memoria, y aplicar etiquetas a ellos. Las etiquetas en sí mismas no tienen tipos, y se pueden poner en cualquier tipo de objeto:

>>> my_flexible_name = 1
>>> my_flexible_name
1
>>> my_flexible_name = 'This is a string'
>>> my_flexible_name
'This is a string'
>>> my_flexible_name = [3, 'more info', 3.26]
>>> my_flexible_name
[3, 'more info', 3.26]
>>> my_flexible_name = print
>>> my_flexible_name

Puede asignar my_flexible_name a cualquier tipo de objeto, y Python se acaba de rodar con él.

Cuando usted está comparando Python vs C ++, la diferencia en las variables vs nombres puede ser un poco confuso, pero viene con algunos excelentes beneficios. Una es que en Python no tiene punteros, y que nunca es necesario pensar en el montón vs cuestiones pila. Vas a sumergirse en la gestión de memoria un poco más adelante en este artículo.

de comprensión

Python tiene una función de lenguaje llamado listas por comprensión . Si bien es posible emular la lista por comprensión en C ++, que es bastante complicado. En Python, que son una herramienta básica que se enseña a los programadores principiantes.

Una manera de pensar acerca de las listas por comprensión es que son como un super-cargado inicializador para listas, predice, o conjuntos. Dado un objeto iterable, puede crear una lista, y el filtro o modificar el original mientras lo hace:

>>> [x**2 for x in range(5)]
[0, 1, 4, 9, 16]

Este script se inicia con la gama iterable (5) y crea una lista que contiene el cuadrado de cada elemento en el iterable.

de posible para añadir condiciones a los valores en la primera iterable:

>>> odd_squares = [x**2 for x in range(5) if x % 2]
>>> odd_squares
[1, 9]

El si x% 2 al final de esta comprensión limita los números usados ​​de la gama de (5) a sólo los impares.

En este punto usted podría estar teniendo dos pensamientos:

Si bien es cierto que se puede crear un vector de los cuadrados de los números impares en C ++, haciendo así que por lo general significa un código de poco más:

std::vector odd_squares;
for (int ii = 0; ii < 10; ++ii) { if (ii % 2) { odd_squares.push_back(ii*ii); } }

Para los desarrolladores que vienen de C al estilo de idiomas, listas por comprensión son una de las primeras formas notables que pueden escribir un código más Pythonic. Muchos desarrolladores de Python comienzan a escribir con la estructura C ++:

odd_squares = []
for ii in range(5):
if (ii % 2):
odd_squares.append(ii)

Esto es perfectamente válida en Python. Es probable que se ejecutará más lentamente, sin embargo, y no es tan claro y conciso como la lista de comprensión. Aprender a usar las listas por comprensión no sólo acelerar su código, pero también hará que su código sea más Pythonic y más fácil de leer!

Nota: Cuando estás leyendo sobre Python, que con frecuencia verá la palabra Pythonic utiliza para describir algo. Esto es sólo un término de la comunidad utiliza para describir el código que es limpio, elegante y parece que fue escrito por un Jedi Python. de

Python std :: algoritmos

C ++ tiene un rico conjunto de algoritmos incorporados en la biblioteca estándar. Python tiene un conjunto similar de funciones integradas que cubren el mismo terreno.

El primero y más poderoso de todos ellos es el de operador, lo que proporciona una prueba bastante legible para ver si un artículo está incluido en una lista, conjunto o diccionario:

>>> x = [1, 3, 6, 193]
>>> 6 in x
True
>>> 7 in x
False
>>> y = { 'Jim' : 'gray', 'Zoe' : 'blond', 'David' : 'brown' }
>>> 'Jim' in y
True
>>> 'Fred' in y
False
>>> 'gray' in y
False

Tenga en cuenta que el operador in, cuando se utiliza en los diccionarios, sólo prueba para las llaves, no valores. Esto se muestra en la prueba final, 'gris' en y.

en se puede combinar con la sintaxis no muy legible:

if name not in y:
print(f"{name} not found")

El siguiente paso en su desfile de Python incorporada de operadores alguna. Esta es una función booleana que devuelve True si cualquier elemento de los evalúa iterables dados a True. Esto puede parecer un poco tonto hasta que se acuerda de sus listas por comprensión! Combinando estos dos pueden producir poderosa sintaxis, clara para muchas situaciones:

>>> my_big_list = [10, 23, 875]
>>> my_small_list = [1, 2, 8]
>>> any([x < 3 for x in my_big_list]) False >>> any([x < 3 for x in my_small_list]) True

Fin todo Y, usted tiene toda , que es similar a cualquier. Esto devuelve Verdadero única si usted adivinado-IT todo de los elementos en el iterable son ciertas. Una vez más, combinando esto con listas por comprensión produce una potente característica del lenguaje:

>>> list_a = [1, 2, 9]
>>> list_b = [1, 3, 9]
>>> all([x % 2 for x in list_a])
False
>>> all([x % 2 for x in list_b])
True

cualquiera y todos pueden cubrir gran parte de la misma tierra donde los desarrolladores de C ++ se vería a std :: encontrar o std :: find_if.

Nota: En los cualquiera y todos los ejemplos anteriores, puede eliminar los corchetes ([]) sin ninguna pérdida de funcionalidad. (Por ejemplo: los (x% 2 para x en list_a)) esto hace uso de expresiones generador que, mientras que bastante práctico, están más allá del alcance de este artículo.

Antes de pasar a la tipificación variables, vamos a actualizar su Python vs C ++ tabla de comparación:

Bien, ahora ya está listo para mirar variable y la tipificación de parámetros. ¡Vamonos!

estático vs dinámico Typing

Otro gran tema cuando se está comparando Python vs C ++ es el uso de tipos de datos. C ++ es un lenguaje de tipos estáticos, mientras que Python se escribe de forma dinámica. Vamos a explorar lo que eso significa.

establecimiento de tipos estáticos

C ++ se escribe de forma estática, lo que significa que cada variable que utiliza en su código debe tener un tipo de datos específico, como int, char, float, y así sucesivamente. Puede asignar valores solo del tipo correcto a una variable, a menos que saltar a través de algunos aros.

Esto tiene algunas ventajas, tanto para el desarrollador y el compilador. El desarrollador gana la ventaja de saber cuál es el tipo de una variable en particular es antes de tiempo, y por lo tanto los que se les permite operaciones. El compilador puede utilizar la información de tipo para optimizar el código, por lo que es más pequeño, más rápido, o ambos.

Este conocimiento anticipado tiene un costo, sin embargo. Los parámetros pasados ​​a una función debe coincidir con el tipo esperado por la función, que puede reducir la flexibilidad y la utilidad potencial del código.

Duck Typing

dinámico tipificación se refiere con frecuencia como tipificación de pato. Es un nombre extraño, y usted leer más sobre esto en un minuto! Pero primero, vamos a empezar con un ejemplo. Esta función toma un objeto de archivo y lee las primeras líneas de diez:

def read_ten(file_like_object):
for line_number in range(10):
x = file_like_object.readline()
print(f"{line_number} = {x.strip()}")

Para utilizar esta función, creará un objeto de archivo y pasarlo en:

with open("types.py") as f:
read_ten(f)

Esto muestra cómo el diseño básico de las obras de función. Si bien esta función fue descri ser d como “leer las primeras líneas de diez a partir de un objeto de archivo,” no hay nada en Python que requiere que sea file_like_object un archivo. Mientras el objeto pasado en soportes .readline (), el objeto puede ser de cualquier tipo:

class Duck():
def readline(self):
return "quack"

my_duck = Duck()
read_ten(my_duck)

Calling read_ten () con un objeto Duck produce:

0 = quack
1 = quack
2 = quack
3 = quack
4 = quack
5 = quack
6 = quack
7 = quack
8 = quack
9 = quack

Th es es la esencia de duck typing . Como dice el refrán, “Si parece un pato, nada como un pato, y grazna como un pato, entonces probablemente lo es un pato.”

En otras palabras, si el objeto tiene los métodos necesarios, entonces es aceptable para pasarlo en, independientemente del tipo del objeto. Pato o tipado dinámico le da una enorme cantidad de flexibilidad, ya que permite cualquier tipo que se utiliza donde se encuentra con las interfaces necesarias.

Sin embargo, hay un problema aquí. ¿Qué pasa si se pasa en un objeto que no se se encuentran la interfaz necesaria? Por ejemplo, ¿qué pasaría si se pasa en un número de read_ten (), así: read_ten (3)?

Esto resulta en una excepción que son lanzados. A menos que coger la excepción, el programa va a explotar con un rastreo:

Traceback (most recent call last):
File "", line 1, in
File "duck_test.py", line 4, in read_ten
x = file_like_object.readline()
AttributeError: 'int' object has no attribute 'readline'

dinámico de datos puede ser una herramienta muy poderosa, pero como se puede ver, se debe tener precaución cuando se emplea la misma.

Nota: Python y C ++ son los dos idiomas inflexible de tipos considerados. Aunque C ++ tiene un sistema de tipo más fuerte, los detalles de este general no son significativas para alguien que está aprendiendo Python. el movimiento de

Vamos a una característica que se beneficia de tipado dinámico de Python: Plantillas.

plantillas

Python no tiene plantillas como C ++, pero por lo general no los necesita. En Python, todo es una subclase de un solo tipo de base. Esto es lo que le permite crear funciones de escritura de pato como los anteriores. sistema de plantillas en C ++ El

le permite crear funciones o algoritmos que operan en varios tipos diferentes. Esto es muy potente y puede ahorrar mucho tiempo y esfuerzo. Sin embargo, también puede ser una fuente de confusión y frustración, ya que los errores de compilación en las plantillas se dejará desconcertado.

Ser capaz de utilizar la tipificación de pato en lugar de las plantillas hace que algunas cosas mucho más fácil. Pero esto también puede causar difíciles de detectar problemas. Al igual que en todas las decisiones complejas, hay ventajas y desventajas cuando se está comparando Python vs C ++.

Tipo Comprobación

Ha habido mucho interés y discusión en la comunidad Python últimamente acerca de la comprobación de tipos estática en Python. Proyectos como mypy han planteado la posibilidad de añadir el tipo de pre-ejecución de cheques a puntos específicos en el idioma. Esto puede ser muy útil en la gestión de las interfaces entre las porciones de grandes paquetes o las API específicas.

Ayuda a dirección de una de las desventajas de la tipificación de pato. Para los desarrolladores utilizando una función, ayuda si pueden entender completamente lo que cada parámetro tiene que ser. Esto puede ser útil en grandes equipos de proyecto, donde muchos desarrolladores necesitan comunicarse a través de APIs.

Una vez más, vamos a echar un vistazo a su Python vs C ++ tabla de comparación:

Ahora ya está listo para pasar a las diferencias en la programación orientada a objetos.

programación orientada a objetos

Al igual que C ++, Python admite un modelo de programación orientado a objetos. Muchos de los mismos conceptos que ha aprendido en C ++ servirán en Python. No obstante, deberá tomar decisiones sobre la herencia, la composición y la herencia múltiple.

Similitudes

herencia entre clases funciona de manera similar en Python vs C ++. Una nueva clase puede heredar métodos y atributos de una o más clases de base, al igual que lo has visto en C ++. Algunos de los detalles son un poco diferente, sin embargo. clases

base en Python no tienen su constructor llamado automáticamente como lo hacen en C ++. Esto puede ser confuso cuando se está cambiando idiomas.

La herencia múltiple también funciona en Python, y tiene al igual que muchas peculiaridades y reglas extrañas como lo hace en C ++.

Del mismo modo, también se puede utilizar la composición de clases de construcción, donde hay objetos de un tipo de retención otros tipos. Teniendo en cuenta todo es un objeto en Python, esto significa que las clases pueden contener cualquier otra cosa en el lenguaje. Diferencias

Existen algunas diferencias, sin embargo, cuando usted está comparando Python vs C ++. Los dos primeros están relacionados.

La primera diferencia es que Python no tiene concepto de modificadores de acceso para las clases. Todo en un objeto de clase es pública. La comunidad Python ha desarrollado una convención que cualquier miembro de una clase de partida con un solo subrayado es tratada como privada. Esto es de ninguna manera forzada por el lenguaje, pero parece que funciona bastante bien.

El hecho de que cada miembro de la clase y el método es público en Python conduce a la segunda diferencia: Python tiene el apoyo de encapsulación mucho más débil que C ++.

Como se ha mencionado, la convención subrayado único hace que esta muy lejos de ser un problema en bases de código prácticos de lo que es en un sentido teórico. En general, cualquier usuario que rompe esta regla y depende del funcionamiento interno de una clase es buscar problemas.

sobrecargas de operadores vs Métodos Dunder

En C ++, puede agregar operador sobrecargas . Estos le permiten definir el comportamiento de los operadores sintácticas específicas (como ==) para ciertos tipos de datos. Por lo general, esto se utiliza para agregar un uso más natural de sus clases. Para el operador ==, se puede definir exactamente lo que significa para los dos objetos de una clase a ser iguales.

Una diferencia que se lleva a algunos desarrolladores mucho tiempo a entender es cómo evitar la falta de sobrecargas de operadores en Python. Es muy bueno que Python de objetos todo el trabajo en cualquiera de los contenedores estándar, pero lo que si desea que el operador == para hacer una profunda comparación entre dos objetos de la nueva clase? En C ++, se crearía un operador == () en su clase y hacer la comparación.

Python tiene una estructura similar que se utiliza bastante coherente en toda la lengua: métodos dunder . métodos dunder reciben este nombre porque todos comienzan y terminan con un doble subrayado, o “D-bajo”.

Muchas de las funciones integradas que operan sobre objetos en Python son manejados por las llamadas a métodos dunder de ese objeto. Para su ejemplo anterior, se puede añadir __eq __ () a su clase para hacer lo que te gusta la comparación de lujo:

class MyFancyComparisonClass():
def __eq__(self, other):
return True

Esto produce una clase que compara la misma manera que cualquier otra instancia de su clase. No es particularmente útil, pero demuestra el punto.

Hay un gran número de métodos utilizados dunder en Python, y el uso integrado de funciones que de ellos ampliamente. Por ejemplo, la adición de __lt __ () permitirá Python para comparar el orden relativo de dos de sus objetos. Esto significa que no sólo el operador , <=, y > = también trabajo también.

Aún mejor, si tiene varios objetos de la nueva clase en una lista, entonces usted puede utilizar ordenados () en la lista y que van a ser ordenados usando __lt __ ().

Una vez más, vamos a echar un vistazo a su Python vs C ++ tabla de comparación:

Ahora que usted ha visto la codificación a través de ambos lenguajes orientados a objetos, vamos a ver cómo Python y C ++ gestionar esos objetos en la memoria.

Gestión de memoria

Una de las mayores diferencias, cuando se está comparando Python vs C ++, es la forma en que manejan la memoria. Como se vio en la sección acerca de las variables en C ++ y nombres de Python, Python no tiene punteros, ni fácilmente le permiten manipular la memoria directamente. Si bien hay momentos en los que quieren tener ese nivel de control, la mayoría de las veces no es necesario.

Ceder el control directo de posiciones de memoria trae algunos beneficios. Usted no necesita preocuparse por la propiedad de memoria, o asegurarse de que la memoria se libera una vez (y sólo una vez) después de que haya sido asignado. También nunca tiene que preocuparse acerca de si o no un objeto se asigna en la pila o el montón, que tiende a tropezar a partir de desarrolladores de C ++.

Python gestiona todas estas cuestiones para usted. Para ello todo en Python es un objeto de la clase derivada de Python. Esto permite que el intérprete de Python para implementar el recuento de referencias como un medio de hacer el seguimiento de los cuales los objetos son todavía en uso y que puede ser liberado.

Esta comodidad tiene un precio, por supuesto. Para liberar los objetos de memoria asignados para que, en ocasiones necesitará Python para ejecutar lo que se llama un colector de basura , que encuentra objetos de memoria no utilizados y los libera.

Nota: CPython tiene un esquema de gestión de memoria compleja, lo que significa que la liberación de memoria no significa necesariamente que la memoria se devuelve al sistema operativo.

Python utiliza dos herramientas para liberar memoria: la mirada de

Veamos cada una de ellas por separado. Contar

Referencia colector

El colector recuento de referencias es fundamental para el intérprete de Python estándar y siempre se está ejecutando. Su acción consiste en llevar la cuenta de cuántas veces un bloque dado de la memoria (que es siempre un objeto de Python) tiene un nombre que se le atribuye, mientras que su programa se está ejecutando. Muchas reglas describen cuando el recuento de referencia se incrementa o disminuye, sino un ejemplo de un caso podrían aclarar:

1 >>> x = 'A long string'
2 >>> y = x
3 >>> del x
4 >>> del y

En el ejemplo anterior, la línea 1 crea un nuevo objeto que contiene la cadena "Una larga cadena". A continuación, coloca el nombre x en este objeto, el aumento de recuento de referencia del objeto a 1:

En la línea 2 se asigna y para nombrar el mismo objeto, lo que aumentará el número de referencias a 2:

Cuando llama a del con x en la línea 3, que está retirando una de las referencias al objeto, dejando caer la parte posterior recuento de 1:

por último, cuando se quita y, la última referencia al objeto, su contador de referencia cae a cero y puede ser liberado por el recolector de basura recuento de referencias. Puede o no puede ser liberado de inmediato en este punto, pero en general, que no debe importar a los desarrolladores:

Si bien esto se hará cargo de encontrar y liberar a muchos de los objetos que necesitan ser liberados, hay algunas situaciones que no van a coger. Por eso, es necesario el recolector de basura generacional.

generacional del colector de basura

Uno de los grandes agujeros en el esquema de referencia que cuenta es que su programa puede crear un ciclo de referencias, en los que el objeto A tiene una referencia al objeto B, que tiene una espalda referencia al objeto A. Es muy posible para golpear esta situación y no tienen nada en su código que hace referencia a cualquiera de los objetos. En este caso, ninguno de los objetos serán nunca golpeó a un contador de referencia de 0.

El recolector de basura generacional implica un algoritmo complejo que está más allá del alcance de este artículo, pero va a encontrar algunos de estos ciclos de referencia huérfanos y gratuita para usted. Se ejecuta de forma ocasional controlada por los ajustes descritos en la documentación. Uno de estos parámetros es desactivar esta recolector de basura por completo.

cuando no lo hacen ¿Quieres Garbage Collection

Cuando usted está comparando Python vs C ++, como cuando usted está comparando las dos herramientas, cada una ventaja viene con una solución de compromiso. Python no requiere la gestión de memoria explícita, pero en ocasiones se gastará una cantidad de tiempo más largo de lo esperado en la recolección de basura. El inverso es cierto para C ++: el programa tendrá tiempos de respuesta consistentes, pero tendrá que gastar más esfuerzo en la gestión de la memoria.

En muchos programas de vez en cuando la recolección de basura golpe no es importante. If you’re writing a script that only runs for 10 seconds, then you’re unlikely to notice the difference. Some situations, however, require consistent response times. Real-time systems are a great example, where responding to a piece of hardware in a fixed amount of time can be essential to the proper operation of your system.

Systems with hard real-time requirements are some of the systems for which Python is a poor language choice. Having a tightly controlled system where you’re certain of the timing is a good use of C++. These are the types of issues to consider when you’re deciding on the language for a project.

Time to update your Python vs C++ chart:

Threading, Multiprocessing, and Async IO

The concurrency models in C++ and Python are similar, but they have different results and benefits. Both languages have support for threading, multiprocessing, and Async IO operations. Let’s look at each of these.

Threading

While both C++ and Python have threading built into the language, the results can be markedly different, depending on the problem you’re solving. Frequently, threading is used to address performance problems. In C++, threading can provide a general speed-up for both computationally bound and I/O bound problems, as threads can take full advantage of the cores on a multiprocessor system.

Python, on the other hand, has made a design trade-off to use the Global Interpreter Lock , or the GIL, to simplify its threading implementation. There are many benefits to the GIL, but the drawback is that only one thread will be running at a single time, even if there are multiple cores.

If your problem is I/O bound, like fetching several web pages at once, then this limitation will not bother you in the least. You’ll appreciate Python’s easier threading model and built-in methods for inter-thread communications. If your problem is CPU-bound, however, then the GIL will restrict your performance to that of a single processor. Fortunately, Python’s multiprocessing library has a similar interface to its threading library.

Multiprocessing

Multiprocessing support in Python is built into the standard library. It has a clean interface that allows you to spin up multiple processes and share information between them. You can create a pool of processes and spread work across them using several techniques.

While Python still uses similar OS primitives to create the new processes, much of the low-level complication is hidden from the developer.

C++ relies on fork() to provide multiprocessing support. While this gives you direct access to all of the controls and issues of spawning multiple processes, it’s also much more complex.

Async IO

While both Python and C++ support Async IO routines, they’re handled differently. In C++, the std::async methods are likely to use threading to achieve the Async IO nature of their operations. In Python, Async IO code will only run on a single thread.

There are trade-offs here as well. Using separate threads allows the C++ Async IO code to perform faster on computationally bound problems. The Python tasks used in its Async IO implementation are more lightweight, so it’s faster to spin up a large number of them to handle I/O bound issues.

Your Python vs C++ comparison chart remains unchanged for this section. Both languages support a full range of concurrency options, with varying trade-offs between speed and convenience.

Miscellaneous Issues

If you’re comparing Python vs C++ and looking at adding Python to your toolbelt, then there are a few other things to consider. While your current editor or IDE will certainly work for Python, you might want to add certain extensions or language packs. It’s also worth giving PyCharm a look, as it’s Python-specific.

Several C++ projects have Python bindings. Things like Qt, WxWidgets, and many messaging APIs having multiple-language bindings.

If you want to embed Python in C++, then you can use the Python/C API.

Finally, there are several methods for using your C++ skills to extend Python and add functionality, or to call your existing C++ libraries from within your Python code. Tools like CTypes, Cython, CFFI, Boost.Python and Swig can help you combine these languages and use each for what it’s best at.

Summary: Python vs C++

You’ve spent some time reading and thinking about the differences between Python vs C++. While Python has easier syntax and fewer sharp edges, it’s not a perfect fit for all problems. You’ve looked at the syntax, memory management, processing, and several other aspects of these two languages.

Let’s take a final look at your Python vs C++ comparison chart:

If you’re comparing Python vs C++, then you can see from your chart that this is not a case where one is better than the other. Each of them is a tool that’s well crafted for various use cases. Just like you don’t use a hammer for driving screws, using the right language for the job will make your life easier!

Conclusion

Congrats! You’ve now seen some of the strengths and weaknesses of both Python and C++. You’ve learned some of the features of each language and how they are similar.

You’ve seen that C++ is great when you want:

  • Fast execution speed (potentially at the cost of development speed)
  • Complete control of memory

Conversely, Python is great when you want:

  • Fast development speed (potentially at the cost of execution speed)
  • Managed memory

You’re now ready to make a wise language choice when it comes to your next project!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *