目录
目录
1.程序执行
在C++中,使用编译器将源代码转换为机器代码并生成可执行文件。可执行文件是一个单独的文件,然后可以作为独立程序运行。此过程将输出针对其特定处理器和操作系统的实际机器指令,这意味着您必须分别针对Windows,Mac和Linux重新编译程序。
在Python中,Python像C ++编译器一样编译您的源代码。区别在于Python编译为字节码而不是本机代码。字节码是Python虚拟机的本机指令代码,生成的字节码不在处理器上以本机方式运行,而是由Python虚拟机运行。这类似于Java虚拟机或.NET Common Runtime Environment。
为了加快程序的后续运行速度,Python将字节码存储在.pyc
文件中。如果您使用的是Python 2,则会在文件旁边找到这些.py
文件。对于Python 3,您将在__pycache__
目录中找到它们。只要没有更改程序,以后的每次运行都会跳过编译步骤,并使用以前编译的字节码来解释。
解释代码要比直接在硬件上运行本机代码慢。那么为什么Python是这样工作的呢?好吧,解释虚拟机中的代码意味着只需要为特定处理器上的特定操作系统编译虚拟机。所有的Python代码都将能够在任何具有Python的机器上运行。
结果:C++执行更快,Python支持跨平台执行
2.语法
空格:Python使用空格来标记作用域,这意味着if块或其他类似结构的主体由缩进级别表示。C++使用卷轴括号({})来表示相同的思想。
布尔表达式:C++中计算结果为0指示为
false
,其他所有数值指示为true
。Python概念与之相似,但扩展了其他情况,具体有定义为false的常量(None,False),任何数字类型的0(0,Decimal(0)),空的序列或者集合('',[],{},(),range(0))。布尔运算符也有所不同。
3.列表推导
可以把推导式理解为列表、字典和集合的超动力的初始化程序。给定一个可迭代对象,您可以创建一个列表,并在执行此操作时添加条件来过滤或修改原始对象,例如实现奇数平方的列表:
#C++结构的Python代码
odd_squares=[]
for x in range(5):
if x%2:
odd_squares.append(x**2)
#列表推导式的Python代码
odd_squares=[x**2 for x in range(5) if x%2]
4.动态类型、静态类型
C++是静态类型,这意味着每个在代码中使用的变量都必须为一个特定的数据类型,如int
,char
,float
等等,只能将正确类型的值分配给变量。这样的好处是,开发提前知道变量类型,从而进行相应操作;编译器可以使用类型信息来优化代码,以使其更小,更快或两者兼而有之。代价是传递给函数的参数必须与函数期望的类型匹配,这会降低代码的灵活性和潜在的实用性。
动态类型通常称为鸭子类型,本质是如果对象具有所需的方法,则无论对象的类型如何,都可以将其传入。这提供了极大的灵活性,因为它允许在满足所需接口的地方使用任何类型。如果传入的对象不符合,则会抛出xx对象没有xx属性的异常: AttributeError: 'xx' object has no attribute 'xx'
Python的静态类型检查:怎样在python3.6中使用静态类型检查 https://cloud.tencent.com/developer/news/354893
5.内存管理
Python没有指针,也不容易直接操作内存,当然这种级别的控制在大多数时候没有必要。放弃对存储位置的直接控制会带来一些好处,不必担心内存所有权,也不必确保在分配内存后将其释放一次(并且只能释放一次),也不必担心是否在堆栈或堆上分配了对象。
Python使用两种工具释放内存:引用计数收集器、分代回收机制
引用计数收集器是标准Python解释器的基础,并且始终在运行。它通过跟踪object
程序运行时给定内存块(始终为Python )附加名称的次数来工作。以下情况的示例可以阐明:
>>> x = '长字符串'
>>> y = x
>>> del x
>>> del y
当删除y对对象的引用后,该对象的引用计数将至0,并且可以由引用计数垃圾收集器将其释放。此时可能会或可能不会立即释放它,但这对开发人员而言并不重要。
引用计数变量需要保护,以防止出现两个线程同时增大或减小其值的竞争情况。如果发生这种情况,则可能导致从未释放的内存泄漏,或者更糟糕的是,在仍然存在对该对象的引用的情况下,错误地释放了内存。这可能会导致崩溃或Python程序中的其他“怪异”错误。Python使用全局解释器锁GIL解决该问题。
引用计数垃圾收集器的方案有个大漏洞,当程序构建一个引用循环,其中object A
具有对object B的引用,而object B具有对object A的引用。完全有可能遇到这种情况,并且在代码中没有任何对象引用任何对象。在这种情况下,两个对象都不会达到参考计数0。分代回收机制涉及的复杂算法超出了本文的范围。
结论:相比Python,C++的程序将具有一致的响应时间,但需要在管理内存上花费更多的精力。
本文对比结果:
C ++:快速的执行速度(可能以开发速度为代价),完全控制内存
Python:快速的开发速度(可能以执行速度为代价),托管内存