自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python PK C++,究竟誰(shuí)更勝一籌?

開發(fā) 后端
在本文中,我們重點(diǎn)介紹了這兩種語(yǔ)言之間的相似點(diǎn)和差異性,以便我們理解何時(shí)使用哪種語(yǔ)言。

在編程生涯的早期階段,我參與過一款C++數(shù)學(xué)優(yōu)化應(yīng)用程序的開發(fā),這個(gè)程序?qū)π阅艿囊蠛芨?。至今我依然記得那段艱難的經(jīng)歷。

在那個(gè)項(xiàng)目中,我遇到了一些概念,比如指針、并發(fā)和垃圾回收,剛開始的時(shí)候這些概念非常難以理解。

然而,如果你問我對(duì)C++的看法,那么我會(huì)很高興地向想要構(gòu)建實(shí)時(shí)應(yīng)用程序的人推薦C++。

C++是一門非常強(qiáng)大的編程語(yǔ)言。

[[313697]]

最近,我一直在從事有關(guān)機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)解決方案的架構(gòu)和實(shí)現(xiàn)工作。我選擇的語(yǔ)言是Python。我承認(rèn)也很欣賞這種語(yǔ)言的簡(jiǎn)單性和強(qiáng)大性。有些程序員認(rèn)為Python是一種原型編程語(yǔ)言,當(dāng)然他們有自己的正當(dāng)理由。但是,我會(huì)毫不猶豫地向想要構(gòu)建數(shù)據(jù)分析應(yīng)用程序的人推薦Python。

Python是對(duì)開發(fā)人員非常友好的編程語(yǔ)言。

C++和Python都是非常流行的編程語(yǔ)言。本文將重點(diǎn)介紹兩種語(yǔ)言之間的相似點(diǎn)和差異性,以便我們理解何時(shí)使用哪種語(yǔ)言。

這兩種語(yǔ)言有很多差異和相似之處,但本文只介紹我們必須了解的關(guān)鍵性功能。

首先,兩種編程語(yǔ)言有很多相似之處,所以學(xué)習(xí)起來也不難。

Python是解釋型語(yǔ)言,而C++不是

C++的工作方式是,首先將寫好的代碼保存到擴(kuò)展名為.cpp的文件中。

然后編譯.cpp文件。編譯器將C++代碼轉(zhuǎn)換為原生代碼。然后執(zhí)行這些機(jī)器代碼。因此,C++非常靠近硬件。

所以,C++的速度非???,非常適合實(shí)時(shí)應(yīng)用程序。關(guān)鍵在于C++應(yīng)用是“原生”應(yīng)用,這表明編譯器是依賴操作系統(tǒng)和處理器的組件。

編譯器依賴機(jī)器,因此C++也依賴機(jī)器。 

但是,這意味著代碼只能在與編譯代碼的編譯器相兼容的操作系統(tǒng)(和處理器)上運(yùn)行。具體來說:

  •  如果在Windows機(jī)器上用Windows編譯器來編譯代碼,則會(huì)生成Windows機(jī)器代碼。
  •  如果使用Linux編譯器來編譯cpp代碼,則編譯后的代碼只能在Linux機(jī)器上運(yùn)行。

有時(shí),有些C++模塊/軟件包并不能與所有操作系統(tǒng)兼容。

[[313698]]

另一方面,Python是一種解釋語(yǔ)言。Python的工作方式是,首先在安裝Python軟件包的位置創(chuàng)建一個(gè)虛擬機(jī)。

然后將寫好的python代碼保存到.py文件中。

然后再通過CPython,將Python代碼編譯為Python虛擬機(jī)的字節(jié)碼。

那么,這個(gè)Python虛擬機(jī)就像C++一樣是依賴于機(jī)器的,但是Python代碼卻不是。 

當(dāng)你想執(zhí)行字節(jié)碼時(shí),這些代碼就會(huì)在運(yùn)行時(shí)被解釋。因此Python不依賴于機(jī)器。

Python字節(jié)碼依賴于Python虛擬機(jī),而Python不依賴于機(jī)器。

需要注意的一點(diǎn)是,我們可以在一個(gè)操作系統(tǒng)中編寫Python代碼,然后將其復(fù)制到另一個(gè)操作系統(tǒng)中,就可以運(yùn)行。但C++不行。我們必須在每個(gè)OS上編譯C++代碼。正是這個(gè)原因,與Python相比,C++的運(yùn)行速度非??臁?/p>

由于Python是一種解釋型語(yǔ)言,因此它的運(yùn)行速度比C++慢。

編程約定

首先,我們來看一看易用性。

Python是一種高級(jí)語(yǔ)言,而C++是一種低級(jí)語(yǔ)言。Python具有可讀性、簡(jiǎn)單、直截了當(dāng),而且學(xué)習(xí)起來很簡(jiǎn)單。

這是一大優(yōu)勢(shì),因?yàn)檫@意味著采用Python的開發(fā)人員越來越多。而且這個(gè)特性還可以迅速地將Python應(yīng)用程序推向市場(chǎng)。

由于易用性和大量的庫(kù),Python成為了數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)項(xiàng)目的首選編程語(yǔ)言,而且在Web開發(fā)中也越來越受歡迎。

Python非常適合于測(cè)試新概念和想法。

然而,有時(shí)也因?yàn)檫@個(gè)原因?qū)е鲁绦騿T將Python視為一種原型語(yǔ)言。但話又說回來,這種觀點(diǎn)的理由也很充分。在實(shí)現(xiàn)Python時(shí),我們始終應(yīng)該遵循最佳的軟件原理和實(shí)踐。

對(duì)于剛接觸編程領(lǐng)域的人來說,Python是一門偉大的語(yǔ)言。

另一方面,C++起源于C語(yǔ)言。它是一種功能強(qiáng)大的語(yǔ)言,因此很復(fù)雜,因?yàn)樗梢詧?zhí)行很多低級(jí)任務(wù)。

開發(fā)人員需要遵守C++中大量的約定和規(guī)則。

[[313699]]

C++廣泛用于游戲開發(fā)、后端服務(wù)器應(yīng)用程序以及分布式交易應(yīng)用程序,這些系統(tǒng)都要求快速執(zhí)行任務(wù)。此外,C++具有極強(qiáng)的可移植性。

下面,我們來談?wù)務(wù)Z法。

1. Python編程十分依賴于空白和制表符(縮進(jìn))。一切都是對(duì)象。所有類的屬性和方法都是公有的。在C++中我們可以利用訪問修飾符隱藏類的屬性/方法,Python卻做不到。

我感覺剛開始的時(shí)候很難適應(yīng)Python的縮進(jìn)和格式。

2. 我想,大多數(shù)開發(fā)人員都知道Python中沒有分號(hào)或大括號(hào)。你可以編寫整潔的列表推導(dǎo)。Python中的布爾表達(dá)式也沒有括號(hào)。另一方面,C++非常依賴于括號(hào)和分號(hào)。適應(yīng)C++的語(yǔ)法需要一定的時(shí)間。

3. C++是一種強(qiáng)類型語(yǔ)言,每個(gè)變量的類型需要預(yù)先聲明。而Python是動(dòng)態(tài)類型,我們不需要指出對(duì)象的類型。這種動(dòng)態(tài)特性常常會(huì)讓我們遇到意想不到的結(jié)果。Python程序員需要保證以正確的方式或在正確的上下文中使用對(duì)象,因此既有積極的一面,也有消極的一面。

在執(zhí)行Python代碼時(shí),我們會(huì)遇到運(yùn)行時(shí)錯(cuò)誤。如果在生產(chǎn)運(yùn)行時(shí)中遇到類型錯(cuò)誤,就很尷尬了。

值得一提的是,為了實(shí)現(xiàn)可以在運(yùn)行之前就發(fā)現(xiàn)問題的Python解決方案,許多開發(fā)人員花費(fèi)了大量時(shí)間和精力。

內(nèi)存管理和并發(fā) 

在介紹管理內(nèi)存的方式之前,首先我們應(yīng)該注意,這兩種編程語(yǔ)言都支持面向?qū)ο蟮木幊毯屠^承。

當(dāng)程序員在程序中創(chuàng)建對(duì)象時(shí),這些對(duì)象會(huì)占用內(nèi)存。當(dāng)不使用對(duì)象時(shí),程序?qū)⑼ㄟ^垃圾回收清除掉這個(gè)垃圾。

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

作為Python程序員,我們無需擔(dān)心如何以及何時(shí)地清除內(nèi)存。Python會(huì)通過智能垃圾回收自動(dòng)為我們處理內(nèi)存。C++中沒有這樣的垃圾回收,你必須自己動(dòng)手管理內(nèi)存。

[[313700]]

C++中的內(nèi)存管理需要手動(dòng)完成。

理由很充分。C++的設(shè)計(jì)主旨就是打造一種高性能的編程語(yǔ)言。負(fù)責(zé)管理內(nèi)存并從內(nèi)存中刪除不使用對(duì)象的垃圾回收會(huì)影響應(yīng)用程序的性能。

最重要的是,垃圾回收在本質(zhì)上是不確定的。你無法保證對(duì)象刪除后是否仍在內(nèi)存中。

Python是一種對(duì)開發(fā)人員非常友好的編程語(yǔ)言,因?yàn)槲覀儾槐負(fù)?dān)心忘記釋放內(nèi)存。

并發(fā)

對(duì)于受I/O或CPU約束的應(yīng)用程序,程序員常常喜歡在代碼中創(chuàng)建多個(gè)線程,并通過同時(shí)運(yùn)行這些線程加快計(jì)算的速度。

不管我們的計(jì)算機(jī)中有多少個(gè)核心,Python只允許我們一次執(zhí)行一個(gè)線程。這是Python的全局解釋器造成的限制。這會(huì)給需要多個(gè)CPU的應(yīng)用程序造成問題。

但是,我們可以在Python中創(chuàng)建多個(gè)進(jìn)程。

另一方面,C++允許我們實(shí)現(xiàn)多線程應(yīng)用程序。

C++有指針,但Python沒有

談?wù)揅++,怎么能不提指針?

Python中沒有指針,至少?zèng)]有開箱即用的指針。但是,C++中有指針。

首先,讓我們來解釋一下指針是什么。

假設(shè)有一個(gè)變量。這個(gè)變量是一個(gè)整數(shù),值設(shè)置為5。那么,變量與它的值是一個(gè)意思,比如x = 5,x是變量的名稱,值為5。

在C++中,變量是通過值傳遞給函數(shù)的。

那么問題在于,這些值保存在哪里?

變量的每個(gè)值都保存在計(jì)算機(jī)的內(nèi)存地址中。你可以使用C++的運(yùn)算符&訪問變量的內(nèi)存地址。指針是一個(gè)變量,指向了值所在的內(nèi)存地址。

指針能夠提高程序的效率。 

在標(biāo)識(shí)符之前使用運(yùn)算符*,就可以聲明一個(gè)指針。如下所示: 

  1. int* y = &x 

上述,我們創(chuàng)建了一個(gè)指針變量y,這個(gè)變量保存了變量x的內(nèi)存地址。

假設(shè)你有一個(gè)函數(shù)接受變量作為輸入(參數(shù))。這個(gè)值的變更意味著在函數(shù)內(nèi)部創(chuàng)建一個(gè)新變量。請(qǐng)記住,這在C++中會(huì)占用大量的內(nèi)存,變量是通過值傳遞給函數(shù)的。

具體來說,首先我們創(chuàng)建一個(gè)將傳入變量加100的函數(shù)。 

  1. void add_hundred(int x) {  
  2.     x += 100;  

這段代碼接受一個(gè)變量x,然后將x加100。

在函數(shù)內(nèi)部,任何有關(guān)這個(gè)值的修改都會(huì)針對(duì)一個(gè)新變量,而不是原來的變量。

調(diào)用上述代碼的主函數(shù)如下: 

  1. int main(void) {  
  2.     int x = 2337 
  3.     add_hundred(x);  
  4.     return 0;  

即使在執(zhí)行完函數(shù)之后,在函數(shù)外部,x的值仍然是2337。

那么,為什么我們需要指針? 

為了理解這一點(diǎn),你必須明白值和引用類型之間的區(qū)別。值類型就好像每次都從物理上復(fù)制變量并賦給它一個(gè)新變量。值類型占用的空間更多,而且每個(gè)變量都有自己的內(nèi)存地址。 

我們可以修改上述函數(shù),讓它接受指針作為參數(shù)。這樣的修改可以減少程序占用的內(nèi)存量。而且還不會(huì)創(chuàng)建不必要的重復(fù)變量。

如下函數(shù)可以直接修改變量的值。  

  1. void add_hundred(int *x) {  
  2.     *x += 100;  
  3. }int main(void) {  
  4.     int x = 2337 
  5.     int *y = &x    add_hundred(y);  
  6.     return 0;  

下面,我們創(chuàng)建了一個(gè)指針y,并傳遞給一個(gè)函數(shù),而這個(gè)函數(shù)會(huì)將輸入?yún)?shù)x加100,即使位于函數(shù)外部的x值也會(huì)發(fā)生變化。也就是說,在函數(shù)執(zhí)行完成后,x的值為2437。

我對(duì)指針的看法

使用指針的原因之一在于,你可以在調(diào)用的函數(shù)中修改變量或?qū)ο蟆5?,我建議盡量避免使用指針。

在C++中,使用引用比使用指針更好,因?yàn)槟憧梢暂p松地修改調(diào)用的函數(shù),而不會(huì)改變調(diào)用所表示的語(yǔ)義。 

指針是一個(gè)復(fù)雜的主題,程序員會(huì)經(jīng)常因?yàn)槭褂弥羔樁斐蓛?nèi)存管理錯(cuò)誤。Python是適合初學(xué)者的編程語(yǔ)言,因此Python中沒有這種復(fù)雜的類型。

最終的建議

我有什么建議?Python還是C++?

這取決于你需要實(shí)現(xiàn)的解決方案。你是否需要跨平臺(tái)、高性能、機(jī)器學(xué)習(xí)的解決方案?

如果條件允許的話,你可以同時(shí)使用兩者。 

我強(qiáng)烈建議兩者你都應(yīng)該學(xué)習(xí)和使用,因?yàn)檫@可以拓寬你對(duì)編程語(yǔ)言的理解。

  •  如果你熟悉C++,那么毫不費(fèi)力就可以用Python編寫程序。
  •  如果你熟悉Python,那么應(yīng)該對(duì)大多數(shù)的編程概念都有很好的了解,C++可以幫助你進(jìn)一步理解內(nèi)存管理、并發(fā)和指針等,因此二者都應(yīng)該學(xué)習(xí)。

另外,你還可以將Python和C++集成到一起,實(shí)現(xiàn)高級(jí)的實(shí)時(shí)分析解決方案。

總結(jié)

C++和Python都是非常流行的語(yǔ)言,我非常推薦所有人都來學(xué)習(xí)這兩種語(yǔ)言。

在本文中,我們重點(diǎn)介紹了這兩種語(yǔ)言之間的相似點(diǎn)和差異性,以便我們理解何時(shí)使用哪種語(yǔ)言。 

 

責(zé)任編輯:龐桂玉 來源: AI科技大本營(yíng)
相關(guān)推薦

2017-01-11 14:38:39

編程語(yǔ)言Java

2024-07-31 09:39:33

2018-06-12 10:09:41

編程語(yǔ)言PythonJava

2013-02-19 13:13:33

SurfaceiPad

2020-03-06 09:21:28

PWA原生應(yīng)用Web

2010-05-28 11:21:17

2023-08-23 15:14:13

Web開發(fā)Javascript編程語(yǔ)言

2014-03-06 15:07:41

青橙小米

2022-07-20 08:16:54

Lombokjava工具

2020-01-18 14:55:03

架構(gòu)運(yùn)維技術(shù)

2017-11-13 15:38:03

VMwareOpenStack混合云

2023-08-09 18:08:35

ChatGPTStackOverflow

2018-10-24 19:50:41

GDPR區(qū)塊鏈數(shù)字身份

2018-10-12 13:54:26

2019-01-04 09:59:14

KafkaRabbitMQMQ

2025-01-03 09:27:14

2010-05-21 16:36:09

GoogleCode

2010-07-27 14:36:31

Flex Array

2017-06-08 15:38:41

2023-04-26 07:34:38

Java并發(fā)編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)