Les principaux inconvénients du langage Python

Le langage de programmation Python est célèbre pour sa simplicité et sa concision. Une syntaxe simple et compréhensible similaire au pseudo-code, ainsi qu'un typage dynamique fort contribuent à la formation rapide et indolore des débutants.


L'interprète de langue s'occupe de tout le travail de bas niveau, libérant le programmeur de la nécessité d'une gestion manuelle de la mémoire. L'impossibilité pratique d'obtenir un défaut de segmentation, ainsi qu'un système d'exception pratique équipé de messages clairs, vous permettent de déboguer rapidement des programmes. Les situations où leurs chutes dues à une erreur nécessitent un débogage en profondeur sont assez rares.


Les entiers irremplaçables et la sécurité lors de l'utilisation des conteneurs de la bibliothèque standard font de Python un bon moyen d'idées de pré-prototypage, et un grand nombre de bibliothèques mathématiques de haute qualité déterminent le leadership de ce langage dans les domaines de l'apprentissage automatique, de l'analyse des données et du calcul scientifique.


Les programmeurs plus sophistiqués apprécient ce langage pour les outils pratiques de construction de pipelines retardés ou, comme on dit, paresseux. En Python, cette fonctionnalité est implémentée par les itérateurs et ainsi de suite. générateurs. La bibliothèque de programmation asynchrone est également assez bonne.


Mais tout avec cette langue n'est pas facile et simple. En plus d'une solution architecturale spécifique appelée GIL , incarnée dans l'interpréteur principal du langage CPythonet des problèmes liés à l'efficacité du multithreading, Python présente également des inconvénients plus fondamentaux qui limitent considérablement sa portée.


La vitesse


, , . , , API , AOT-. , , C C++. , , NumPy, . — PyTorch.


, - . , , , Cython, , , .


, , . :


  • Python . Bash, Sh , . . : Linux.
  • . : sqlite3, Django ..
  • , , . Python API . : NumPy, CuPy, PyTorch ..

Python


:


  • .
  • .

CPython, :


typedef struct _object {
    Py_ssize_t ob_refcnt;
    PyTypeObject *ob_type;
} PyObject;

ob_refcnt , . , , , , . ob_type . , , , , , .


, . , .


Python, -, . , .


. , [100, 200, 300, 400, 500], , , , int, , . , , , . , , .



, , Python, . , , , Java , , , . , Java, — , JIT-?


(PyPy ..) Numba, , . , , Python — :


  • -,


    , , , . .


    - :


    >>> x = 3
    >>> x = '36'
    >>> 
    >>> def foo(a, b):
    >>>     if b:
    >>>         return [a]
    >>>     return a
    >>> 
    >>> foo(x, True)
    ['36']
    
    >>> foo(x, False)
    '36'
    
    >>> class Bar:
    >>>     __slots__ = ('baz',)
    >>> 
    >>> x = Bar()
    >>> x.baz = 332
    >>> x.baz
    332
    
    >>> x.baz = 'Some string'
    >>> x.baz
    'Some string'
    
    >>> foo(x, True)
    [<__main__.Bar at 0x10ff0d700>]

    , . , , , , — , .


  • — .


    , , . , :


    >>> a = 5
    >>> b = True
    >>> 
    >>> if b:
    >>>     x = 100
    >>> x
    100
    
    >>> for i in range(10):
    >>>     for j in range(5):
    >>>         pass
    >>> print(i, j)
    9 4

  • . :


    >>> class Meta(type):
    >>>     def __new__(cls, name, bases, attrs):
    >>>         if list in bases:
    >>>             return super().__new__(cls, name, (tuple,), attrs)
    >>>         return super().__new__(cls, name, (list,), attrs)
    >>> 
    >>> class Foo(list, metaclass=Meta):
    >>>     pass
    >>> 
    >>> class Bar(tuple, metaclass=Meta):
    >>>     pass
    >>> 
    >>> issubclass(Foo, list)
    False
    >>> issubclass(Foo, tuple)
    True
    >>> issubclass(Bar, tuple)
    False
    >>> issubclass(Bar, list)
    True

    . , , , . , , , — , . .


    , , , .


    Foo Bar Meta, , . , list, , , tuple, —  list.


    .


  • , .


    >>> from collections.abc import Iterable
    >>> 
    >>> def wrap_class(cls):
    >>>     if issubclass(cls, Iterable):
    >>>         class FooCounter(cls):
    >>>             def count_foo(self):
    >>>                 return sum(1 for item in self if item == 'foo')
    >>> 
    >>>         return FooCounter
    >>>     raise TypeError(f'Class {cls} is not an iterable type')
    >>> 
    >>> wrap_class(list)([2, 3, 'foo', 'bar', 'baz', 'foo']).count_foo()
    2


Python. , MyPy, . , , . , , , typing , . , wrap_class -, .


, , Python 3.8, , , , , - .


, , , . , , Python Numba.



Python, : . , .


, . , , Julia. CPython —  .


Quoi qu'il en soit, Python est un excellent outil pour écrire du code rapidement. Ses vastes capacités dynamiques, ainsi que sa compréhensibilité et, je n'ai pas peur de ce mot, la beauté de la syntaxe déterminent que le processus de compilation de programmes sur celui-ci provoque vraiment de la satisfaction. Néanmoins, comme tout outil, ce langage a ses inconvénients et il est utile de les mémoriser avant de démarrer vos projets.


All Articles