当前位置: 首页 > 编程日记 > 正文

Python PK C++,究竟谁更胜一筹?


作者 | Farhad Malik

译者 | 弯月,编辑 | 屠敏

来源 | CSDN(ID:CSDNnews)

在编程生涯的早期阶段,我参与过一款C++数学优化应用程序的开发,这个程序对性能的要求很高。至今我依然记得那段艰难的经历。

在那个项目中,我遇到了一些概念,比如指针、并发和垃圾回收,刚开始的时候这些概念非常难以理解。

然而,如果你问我对C++的看法,那么我会很高兴地向想要构建实时应用程序的人推荐C++。

C++是一门非常强大的编程语言。

最近,我一直在从事有关机器学习和数据科学解决方案的架构和实现工作。我选择的语言是Python。我承认也很欣赏这种语言的简单性和强大性。有些程序员认为Python是一种原型编程语言,当然他们有自己的正当理由。但是,我会毫不犹豫地向想要构建数据分析应用程序的人推荐Python。

Python是对开发人员非常友好的编程语言。

C++和Python都是非常流行的编程语言。本文将重点介绍两种语言之间的相似点和差异性,以便我们理解何时使用哪种语言。

这两种语言有很多差异和相似之处,但本文只介绍我们必须了解的关键性功能。

首先,两种编程语言有很多相似之处,所以学习起来也不难。

Python是解释型语言,而C++不是

C++的工作方式是,首先将写好的代码保存到扩展名为.cpp的文件中。

然后编译.cpp文件。编译器将C++代码转换为原生代码。然后执行这些机器代码。因此,C++非常靠近硬件。

所以,C++的速度非常快,非常适合实时应用程序。关键在于C++应用是“原生”应用,这表明编译器是依赖操作系统和处理器的组件。

编译器依赖机器,因此C++也依赖机器。

但是,这意味着代码只能在与编译代码的编译器相兼容的操作系统(和处理器)上运行。具体来说:

  • 如果在Windows机器上用Windows编译器来编译代码,则会生成Windows机器代码。

  • 如果使用Linux编译器来编译cpp代码,则编译后的代码只能在Linux机器上运行。

有时,有些C++模块/软件包并不能与所有操作系统兼容。

另一方面,Python是一种解释语言。Python的工作方式是,首先在安装Python软件包的位置创建一个虚拟机。

然后将写好的python代码保存到.py文件中。

然后再通过CPython,将Python代码编译为Python虚拟机的字节码。

那么,这个Python虚拟机就像C++一样是依赖于机器的,但是Python代码却不是。

当你想执行字节码时,这些代码就会在运行时被解释。因此Python不依赖于机器。

Python字节码依赖于Python虚拟机,而Python不依赖于机器。

需要注意的一点是,我们可以在一个操作系统中编写Python代码,然后将其复制到另一个操作系统中,就可以运行。但C++不行。我们必须在每个OS上编译C++代码。正是这个原因,与Python相比,C++的运行速度非常快。

由于Python是一种解释型语言,因此它的运行速度比C++慢。

编程约定

首先,我们来看一看易用性。

Python是一种高级语言,而C++是一种低级语言。Python具有可读性、简单、直截了当,而且学习起来很简单。

这是一大优势,因为这意味着采用Python的开发人员越来越多。而且这个特性还可以迅速地将Python应用程序推向市场。

由于易用性和大量的库,Python成为了数据科学和机器学习项目的首选编程语言,而且在Web开发中也越来越受欢迎。

Python非常适合于测试新概念和想法。

然而,有时也因为这个原因导致程序员将Python视为一种原型语言。但话又说回来,这种观点的理由也很充分。在实现Python时,我们始终应该遵循最佳的软件原理和实践。

对于刚接触编程领域的人来说,Python是一门伟大的语言。

另一方面,C++起源于C语言。它是一种功能强大的语言,因此很复杂,因为它可以执行很多低级任务。

开发人员需要遵守C++中大量的约定和规则。

C++广泛用于游戏开发、后端服务器应用程序以及分布式交易应用程序,这些系统都要求快速执行任务。此外,C++具有极强的可移植性。

下面,我们来谈谈语法。

1. Python编程十分依赖于空白和制表符(缩进)。一切都是对象。所有类的属性和方法都是公有的。在C++中我们可以利用访问修饰符隐藏类的属性/方法,Python却做不到。

我感觉刚开始的时候很难适应Python的缩进和格式。

2. 我想,大多数开发人员都知道Python中没有分号或大括号。你可以编写整洁的列表推导。Python中的布尔表达式也没有括号。另一方面,C++非常依赖于括号和分号。适应C++的语法需要一定的时间。

3. C++是一种强类型语言,每个变量的类型需要预先声明。而Python是动态类型,我们不需要指出对象的类型。这种动态特性常常会让我们遇到意想不到的结果。Python程序员需要保证以正确的方式或在正确的上下文中使用对象,因此既有积极的一面,也有消极的一面。

在执行Python代码时,我们会遇到运行时错误。如果在生产运行时中遇到类型错误,就很尴尬了。

值得一提的是,为了实现可以在运行之前就发现问题的Python解决方案,许多开发人员花费了大量时间和精力。

内存管理和并发 

在介绍管理内存的方式之前,首先我们应该注意,这两种编程语言都支持面向对象的编程和继承。

当程序员在程序中创建对象时,这些对象会占用内存。当不使用对象时,程序将通过垃圾回收清除掉这个垃圾。

垃圾回收的方式工作是不确定的。

作为Python程序员,我们无需担心如何以及何时地清除内存。Python会通过智能垃圾回收自动为我们处理内存。C++中没有这样的垃圾回收,你必须自己动手管理内存。

C++中的内存管理需要手动完成。

理由很充分。C++的设计主旨就是打造一种高性能的编程语言。负责管理内存并从内存中删除不使用对象的垃圾回收会影响应用程序的性能。

最重要的是,垃圾回收在本质上是不确定的。你无法保证对象删除后是否仍在内存中。

Python是一种对开发人员非常友好的编程语言,因为我们不必担心忘记释放内存。

并发

对于受I/O或CPU约束的应用程序,程序员常常喜欢在代码中创建多个线程,并通过同时运行这些线程加快计算的速度。

不管我们的计算机中有多少个核心,Python只允许我们一次执行一个线程。这是Python的全局解释器造成的限制。这会给需要多个CPU的应用程序造成问题。

但是,我们可以在Python中创建多个进程。

另一方面,C++允许我们实现多线程应用程序。

C++有指针,但Python没有

谈论C++,怎么能不提指针?

Python中没有指针,至少没有开箱即用的指针。但是,C++中有指针。

首先,让我们来解释一下指针是什么。

假设有一个变量。这个变量是一个整数,值设置为5。那么,变量与它的值是一个意思,比如x = 5,x是变量的名称,值为5。

在C++中,变量是通过值传递给函数的。

那么问题在于,这些值保存在哪里?

变量的每个值都保存在计算机的内存地址中。你可以使用C++的运算符&访问变量的内存地址。指针是一个变量,指向了值所在的内存地址。

指针能够提高程序的效率。

在标识符之前使用运算符*,就可以声明一个指针。如下所示:

int* y = &x

上述,我们创建了一个指针变量y,这个变量保存了变量x的内存地址。

假设你有一个函数接受变量作为输入(参数)。这个值的变更意味着在函数内部创建一个新变量。请记住,这在C++中会占用大量的内存,变量是通过值传递给函数的。

具体来说,首先我们创建一个将传入变量加100的函数。

void add_hundred(int x) {x += 100;
}

这段代码接受一个变量x,然后将x加100。

在函数内部,任何有关这个值的修改都会针对一个新变量,而不是原来的变量。

调用上述代码的主函数如下:

int main(void) {int x = 2337;add_hundred(x);return 0;
}

即使在执行完函数之后,在函数外部,x的值仍然是2337。

那么,为什么我们需要指针?

为了理解这一点,你必须明白值和引用类型之间的区别。值类型就好像每次都从物理上复制变量并赋给它一个新变量。值类型占用的空间更多,而且每个变量都有自己的内存地址。

我们可以修改上述函数,让它接受指针作为参数。这样的修改可以减少程序占用的内存量。而且还不会创建不必要的重复变量。

如下函数可以直接修改变量的值。

void add_hundred(int *x) {*x += 100;
}int main(void) {int x = 2337;int *y = &x    add_hundred(y);return 0;
}

下面,我们创建了一个指针y,并传递给一个函数,而这个函数会将输入参数x加100,即使位于函数外部的x值也会发生变化。也就是说,在函数执行完成后,x的值为2437。

我对指针的看法

使用指针的原因之一在于,你可以在调用的函数中修改变量或对象。但是,我建议尽量避免使用指针。

在C++中,使用引用比使用指针更好,因为你可以轻松地修改调用的函数,而不会改变调用所表示的语义。

指针是一个复杂的主题,程序员会经常因为使用指针而造成内存管理错误。Python是适合初学者的编程语言,因此Python中没有这种复杂的类型。

最终的建议

我有什么建议?Python还是C++?

这取决于你需要实现的解决方案。你是否需要跨平台、高性能、机器学习的解决方案?

如果条件允许的话,你可以同时使用两者。

我强烈建议两者你都应该学习和使用,因为这可以拓宽你对编程语言的理解。

  • 如果你熟悉C++,那么毫不费力就可以用Python编写程序。

  • 如果你熟悉Python,那么应该对大多数的编程概念都有很好的了解,C++可以帮助你进一步理解内存管理、并发和指针等,因此二者都应该学习。

另外,你还可以将Python和C++集成到一起,实现高级的实时分析解决方案。

总结

C++和Python都是非常流行的语言,我非常推荐所有人都来学习这两种语言。

在本文中,我们重点介绍了这两种语言之间的相似点和差异性,以便我们理解何时使用哪种语言。

原文链接:

https://medium.com/fintechexplained/from-python-to-c-a-thorough-comparison-9244b32d63f4

(*本文为AI科技大本营转载文章,转载请联系原作者)

精彩推荐

1、评选进行中,参与投票即有机会参与抽奖,60+公开课免费学习

2、【Python Day——北京站】现已正式启动,「新春早鸟票」火热开抢!2020年,我们还将在全国多个城市举办巡回活动,敬请期待!活动咨询,可扫描下方二维码加入官方交流群~

CSDN「Python Day」咨询群 ????

来~一起聊聊Python

如果群满100人,无法自动进入,可添加会议小助手微信:婷婷,151 0101 4297(电话同微信)


推荐阅读

  • 云计算的 2020:云原生崛起,重新定义软件

  • Kubernetes 将何去何从?

  • 数十名工程师作战5天,阿里达摩院连夜研发智能疫情机器人

  • 阿里云免费开放一切AI算力,加速新型冠状病毒新药和疫苗研发

  • 疫情之下「在家办公模式」开启,你该选择哪些远程协同工具?

  • Python、Go、JavaScript、Rust 将长盛 5 年

  • 比特币区块链将分道扬镳、Libra 苦难继续,2020 区块链进入关键时期

  • 你点的每个“在看”,我都认真当成了AI

相关文章:

oracle--查看表空间大小以及修改表空间大小

为什么80%的码农都做不了架构师?>>> 一.修改表空间大小 解决以上问题的办法:通过增大表空间即可解决,如下: Sql代码 使用dba用户登陆 sqlplus / as sysdba; 执行如下命令: SQL >…

同步、异步、堵塞、非堵塞和函数调用及I/O之间的组合概念

在我们工作和学习中,经常会接触到“同步”、“异步”、“堵塞”和“非堵塞”这些概念,但是并不是每个人都能将它们的关系和区别说清楚。本文将对这些基本概念进行讨论,以期让大家有更清楚的认识。(转载请指明出于breaksoftware的c…

“抗击”新型肺炎!阿里达摩院研发AI算法,半小时完成疑似病例基因分析

利用技术辅助抗击疫情,阿里巴巴、百度等科技巨头各显身手。此前,AI科技大本营采访报道了阿里达摩院《数十名工程师作战5天,阿里达摩院连夜研发智能疫情机器人》一文,后者为了解决客服人力不足的局面,快速响应政府需求开…

反编译工具jad简单用法

反编译工具jad简单用法 下载地址:[url]http://58.251.57.206/down1?cidB99584EFA6154A13E5C0B273C3876BD4CC8CE672&t2&fmt&usrinput[/url]反编译工具jad &dt2002000一. 不用安装,只要解压就行(有这样两个文件jad.exe&#x…

ubuntu 系统设置bugzilla制

随着时间的推移。在大脑中形成的记忆总会慢慢的淡去。人的记忆力就是这样。所以最好的办法就是形成博客去记录下来,一方面给自己以后回想用。一方面也算是自己的一个积累。所以一旦选择了一个行业,最好不要轻 易转行,由于非常多知识须要不断的…

静态分析C语言生成函数调用关系的利器——cflow

除了《静态分析C语言生成函数调用关系的利器——calltree》一文中介绍的calltree,我们还可以借助cflow辅助我们阅读理解代码。(转载请指明出于breaksoftware的csdn博客) cflow的说明和安装cflow是一款静态分析C语言代码的工具,通过…

我在MongoDB年终大会上获二等奖文章:由数据迁移至MongoDB导致的数据不一致问题及解决方案...

作者 | 上海小胖来源 | Python专栏(ID:xpchuiit)故事背景企业现状2019年年初,我接到了一个神秘电话,电话那头竟然准确的说出了我的昵称:上海小胖。我想这事情不简单,就回了句:您好,我是小胖&…

注意String.Split的几个重载形式

String.Split应该是经常用到的一个函数了,经常的有下面两种形式 public string[] Split(char[] separator, StringSplitOptions options); public string[] Split(string[] separator, StringSplitOptions options); 1. 多数情况下我们会使用第一种,代码里可能这…

如何让猎头找到你

如何让猎头找到你

libev源码解析——总览

libev是个非常优秀的基于事件的循环库,很多开源软件,比如nodejs就是使用其实现基础功能。本系列将对该库进行源码分析。(转载请指明出于breaksoftware的csdn博客) 不知道是被墙了还是网站不再维护,它的官网&#xff08…

GPT-2仅是“反刍”知识,真正理解语言还要改弦更张

作者 | Gary Marcus译者 | 泓技编辑 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】OpenAI的GPT-2正被广泛地讨论,无论是《纽约客》还是《经济学人》,我们都能看到有关它的话题。关于自然和人工智能,它想…

sap business one 笑谈

Sap Business .e 出生在以色列,生下来的时候父母给起了个小名叫SBO,据说他的亲生父母是SAP家庭里的一个重要成员,后来SAP家族里的长老认为SBO长得不错,挺好看的。毕竟SAP家族里生下来的儿子都是胖胖的,想要个瘦点长相好…

来51学院的第一天

【来51学院的第一天】转载于:https://blog.51cto.com/10801189/1703279

libev源码解析——监视器(watcher)结构和组织形式

在《libev源码解析——总览》中,我们介绍了libev的一些重要变量在不同编译参数下的定义位置。由于这些变量在多线程下没有同步问题,所以我们将问题简化,所提到的变量都是线程内部独有的,不用考虑任何多线程问题。(转载…

《评人工智能如何走向新阶段》后记(再续16)

由AI科技大本营下载自视觉中国181.5种常见的机器学习方法。 (1)线性回归linear regression: 一种流行的回归算法,从样本特征的线性组合,linear combination中学习模型。 (2)负数几率回归,logis…

怎么样才能快速的把淘宝店铺推广出去

我来到淘宝近一个月了,目前顺利地得到了两颗心心.感触颇多.其中店铺的推广显得尤其重要,应很多淘友的提问,我把一些店铺推广技巧介绍如下,你如果觉得有益,就回一下贴,以示支持.在这里先谢谢了!先看第一板斧:一、修练内功&#xff…

linux的ftp服务器

2019独角兽企业重金招聘Python工程师标准>>> ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相信掌握了这些使用Linux 进行ftp操…

使用Forms Authentication实现用户注册、登录 (二)用户注册与登录

从这一部分开始,我们将通过一个实际的完整示例来看一下如何实现用户注册与登录。在介绍注册与登录之前,我们首先介绍一下如何判断用户是否已登录,并未后面的示例编写一些基础代码。 判断用户是否已经登录首先,在Web站点项目中添加…

libev源码解析——调度策略

在《libev源码解析——监视器(watcher)结构和组织形式》中介绍过,监视器分为[2,-2]区间5个等级的优先级。等级为2的监视器最高优,然后依次递减。不区分监视器类型和关联的文件描述符的值,权限高的要优先于权限低的执行…

特斯拉AI团队招兵买马:“英雄不问出处”

2月3日,特斯拉创始人兼CEO埃隆•马斯克发布推特,贴出了Autopilot AI团队招聘人才的信息。马斯克在推特中表示,特斯拉AI团队将直接向马斯克回报,他几乎每天都会与团队保持沟通和交流,并透露团队base在德州奥斯汀。据特斯…

java中重载与重写的区别

最近了解一下重载和重写 一、重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。 (2) Ja…

libev源码解析——I/O模型

在《libev源码解析——总览》一文中,我们介绍过,libev是一个基于事件的循环库。本文将介绍其和事件及循环之间的关系。(转载请指明出于breaksoftware的csdn博客) 目前ibev支持如下IO事件模型: select模型。对应文件是…

“数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力

之前有很多程序员读者向我们抱怨:1)做算法优化时,只能现搬书里的算法,遇到不一样的问题,就不会了。2)面试一旦涉及到算法和数据结构,如果数学不行,面试基本就凉凉了。3)一…

VISTA中注册表项LEGACY_****的删除

在VISTA中如果你错误安装了某个驱动软件,而如果这个驱动安装软件考虑不周,无法卸载,那么你就麻烦了!比如我的U盘以前一直使用优易U盘加密软件1.2来做一个隐蔽的U盘。某天我在VISTA上运行了这个U盘加密软件,这个软件运行…

nodejs这个过程POST求

下面是一个web登陆模拟过程。当我们问一个链接,你得到一个表格,然后填写相应的表格值,然后提交登陆。 var http require(http); var querystring require(querystring); http.createServer(function (request, response) {var responseStri…

FTP、HTTP断点续传和多线程的协议基础

使用FTP或HTTP协议的下载软件支持断点续传和多线程的协议基础是:FTP用的是REST和SIZE;HTTP用的是Range。1、FTP实现断点续传的协议基础REST(有的服务器可能不支持此命令)Syntax: REST positionSets the point at which a file tra…

libev源码解析——定时器原理

本文将回答《libev源码解析——I/O模型》中抛出的两个问题。(转载请指明出于breaksoftware的csdn博客) 对于问题1:为什么backend_poll函数需要指定超时?我们让其一直等待到有事件发生不是更好么? 答案是“必须要指定超…

AI颠覆经济世界作用被夸大?影响远比媒体头条报道更加复杂

来源 | The Gradient译者 | 刘畅编辑 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】每天我们都听到有人声称人工智能将改变经济体系,造成大量的失业和垄断。但是,经济学家是如何看待的呢?在第三届AI经…

ArcGIS制图之Sub Points点抽稀

简介 Sub Points工具是 Esri 中国自主开发的一个插件,该工具优先考虑点在空间分布上的均匀合理性,并结合点数据中包含的 "优先级" 属性进行筛选。通过获取每个点在一定范围内拥有的相邻点的数目信息,得到地图中点密度的分布状况。抽…

libev源码解析——定时器监视器和组织形式

我们先看下定时器监视器的数据结构。(转载请指明出于breaksoftware的csdn博客) /* invoked after a specific time, repeatable (based on monotonic clock) */ /* revent EV_TIMEOUT */ typedef struct ev_timer {EV_WATCHER_TIME (ev_timer)ev_tstamp…