Python编程语言以其简洁明了而闻名。一种类似于伪代码的简单易懂的语法,以及强大的动态键入功能,有助于快速,轻松地培训初学者。
语言解释器负责所有底层工作,从而使程序员摆脱了手动内存管理的需要。遇到分段错误的实际可能性以及配备了清晰消息的便捷异常系统使您可以快速调试程序。由于错误而导致跌倒的情况需要进行深度调试的情况非常少见。
使用标准库的容器时,不可替代的整数和安全性使Python成为预原型思想的良好手段,并且大量的高质量数学库确定了该语言在机器学习,数据分析和科学计算领域的领导地位。
更高级的程序员喜欢这种语言,因为它是用于构建延迟的管道(如他们所说的)的便捷工具。在Python中,此功能由迭代器等实现。发电机。异步编程库也相当不错。
但是并不是所有使用这种语言的东西都是容易和简单的。除了在语言的主要解释器中体现的特定体系结构解决方案GILCPython
以及与多线程效率有关的相关问题外,Python还具有更根本的弊端,从而极大地限制了它的范围。
速度
其中主要的原因是它的缓慢性,尽管脚本语言实际上并不需要速度,这一事实在一定程度上可以使司法公正。在需要高性能的任务中,它仅用作处理以支持AOT编译的语言编写的低级库的API的包装。这些语言中目前最受欢迎的当然是C和C ++。例如,第一个实现了为使用NumPy
任意维数数组的数学运算而创建的广泛使用的库。关于第二个增长型神经网络训练框架PyTorch
。
即便如此,也无法在纯Python上编写高性能的东西。为此,您必须求助于其他语言的帮助或使用静态类型的扩展名,例如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
— .
尽管如此,Python是快速编写代码的好工具。它广泛的动态功能以及可理解性,而且我不怕这个词,语法的优美性决定了在其上编译程序的过程确实会引起满意。但是,与任何工具一样,这种语言也有其缺点,在启动项目之前记住它们会很有用。