當前位置:首頁 » 編程語言 » python運行原理

python運行原理

發布時間: 2022-05-05 09:00:07

1. 什麼是python編程

Python是一門新興的編程語言,編程語言有很多,比如C++、java、C#、php、JavaScript等,Python也是其中之一,在學習Python前,我們需要對它有一定的了解。
Python支持多種編程范型,如函數式、指令式、結構化、面向對象和反射式編程。
Python解釋器易於擴展,可以使用C或C++或其他可以通過C調用的語言擴展新的功能和數據類型。
Python編寫的程序不需要編譯成二進制代碼,可以直接從源代碼運行程序,在計算機內部,Python解釋器把源代碼轉換成位元組碼的中間形式,然後再把它翻譯成計算機使用的機器語言並運行。
語法簡潔而清晰,具有豐富和強大的類庫,使用Python快速生成程序的原型,然後對其中有特別要求的部分,用更合適的語言改寫,性能要求特別高,就可以用C/C++重寫,而後封裝為Python可以調用的擴展類庫。
只有基礎建牢固了,才會更利於我們以後的發展及進步,現如今Python的發展十分迅速,已經將C++語言甩在了後邊,在不久的將來,可能會超過C和Java這些主流語言。

2. python是虛擬機嗎

python並不是虛擬機,運行python文件的是python解釋器。python解釋器的工作原理如下:
一、過程概述
1、python先把代碼(.py文件)編譯成位元組碼,交給位元組碼虛擬機,然後虛擬機會從編譯得到的PyCodeObject對象中一條一條執行位元組碼指令,並在當前的上下文環境中執行這條位元組碼指令,從而完成程序的執行。Python虛擬機實際上是在模擬操作中執行文件的過程。PyCodeObject對象中包含了位元組碼指令以及程序的所有靜態信息,但沒有包含程序運行時的動態信息——執行環境(PyFrameObject)
2、位元組碼在python虛擬機程序里對應的是PyCodeObject對象;
.pyc文件是位元組碼在磁碟上的表現形式。
3、從整體上看:OS中執行程序離不開兩個概念:進程和線程。python中模擬了這兩個概念,模擬進程和線程的分別是PyInterpreterState和PyTreadState。即:每個PyThreadState都對應著一個幀棧,python虛擬機在多個線程上切換。當python虛擬機開始執行時,它會先進行一些初始化操作,最後進入PyEval_EvalFramEx函數,它的作用是不斷讀取編譯好的位元組碼,並一條一條執行,類似CPU執行指令的過程。函數內部主要是一個switch結構,根據位元組碼的不同執行不同的代碼。
推薦學習《python教程》
二、關於.pyc文件
PyCodeObject對象的創建時機是模塊載入的時候,即import。
1、執行 python test.py 會對test.py進行編譯成位元組碼並解釋執行,但不會生成test.pyc
2、如果test.py中載入了其他模塊,如import urllib2,那麼python會對urllib2.py進行編譯成位元組碼,生成urllib2.pyc,然後對位元組碼解釋執行。
3、如果想生成test.pyc,我們可以使用python內置模塊py_compile來編譯。
也可以執行命令 python -m test.py 這樣,就生成了test.pyc
4、載入模塊時,如果同時存在.py和.pyc,python會使用.pyc運行,如果.pyc的編譯時間早於.py的時間,則重新編譯.py,並更新.pyc文件。

3. 為什麼說Python採用的是基於值的內存管理模式

先從較淺的層面來說,Python的內存管理機制可以從三個方面來講

(1)垃圾回收

(2)引用計數

(3)內存池機制

一、垃圾回收:

python不像C++,Java等語言一樣,他們可以不用事先聲明變數類型而直接對變數進行賦值。對Python語言來講,對象的類型和內存都是
在運行時確定的。這也是為什麼我們稱Python語言為動態類型的原因(這里我們把動態類型可以簡單的歸結為對變數內存地址的分配是在運行時自動判斷變數
類型並對變數進行賦值)。

二、引用計數:

Python採用了類似Windows內核對象一樣的方式來對內存進行管理。每一個對象,都維護這一個對指向該對對象的引用的計數。如圖所示(圖片來自Python核心編程)

x = 3.14

y = x

我們首先創建了一個對象3.14, 然後將這個浮點數對象的引用賦值給x,因為x是第一個引用,因此,這個浮點數對象的引用計數為1. 語句y =
x創建了一個指向同一個對象的引用別名y,我們發現,並沒有為Y創建一個新的對象,而是將Y也指向了x指向的浮點數對象,使其引用計數為2.

我們可以很容易就證明上述的觀點:

變數a 和 變數b的id一致(我們可以將id值想像為C中變數的指針).

我們援引另一個網址的圖片來說明問題:對於C語言來講,我們創建一個變數A時就會為為該變數申請一個內存空間,並將變數值
放入該空間中,當將該變數賦給另一變數B時會為B申請一個新的內存空間,並將變數值放入到B的內存空間中,這也是為什麼A和B的指針不一致的原因。如圖:

而Python的情況卻不一樣,實際上,Python的處理方式和Javascript有點類似,如圖所示,變數更像是附在對象上的標簽(和引用的
定義類似)。當變數被綁定在一個對象上的時候,該變數的引用計數就是1,(還有另外一些情況也會導致變數引用計數的增加),系統會自動維護這些標簽,並定
時掃描,當某標簽的引用計數變為0的時候,該對就會被回收。

三、內存池機制

Python的內存機制以金字塔行,-1,-2層主要有操作系統進行操作,

第0層是C中的malloc,free等內存分配和釋放函數進行操作;

第1層和第2層是內存池,有Python的介面函數PyMem_Malloc函數實現,當對象小於256K時有該層直接分配內存;

第3層是最上層,也就是我們對Python對象的直接操作;

在 C 中如果頻繁的調用 malloc 與 free 時,是會產生性能問題的.再加上頻繁的分配與釋放小塊的內存會產生內存碎片. Python 在這里主要乾的工作有:

如果請求分配的內存在1~256位元組之間就使用自己的內存管理系統,否則直接使用 malloc.

這里還是會調用 malloc 分配內存,但每次會分配一塊大小為256k的大塊內存.

經由內存池登記的內存到最後還是會回收到內存池,並不會調用 C 的 free
釋放掉.以便下次使用.對於簡單的Python對象,例如數值、字元串,元組(tuple不允許被更改)採用的是復制的方式(深拷貝?),也就是說當將另
一個變數B賦值給變數A時,雖然A和B的內存空間仍然相同,但當A的值發生變化時,會重新給A分配空間,A和B的地址變得不再相同;

而對於像字典(dict),列表(List)等,改變一個就會引起另一個的改變,也稱之為淺拷貝:

附錄:

引用計數增加

1.對象被創建:x=4

2.另外的別人被創建:y=x

3.被作為參數傳遞給函數:foo(x)

4.作為容器對象的一個元素:a=[1,x,』33』]

引用計數減少

1.一個本地引用離開了它的作用域。比如上面的foo(x)函數結束時,x指向的對象引用減1。

2.對象的別名被顯式的銷毀:del x ;或者del y

3.對象的一個別名被賦值給其他對象:x=789

4.對象從一個窗口對象中移除:myList.remove(x)

5.窗口對象本身被銷毀:del myList,或者窗口對象本身離開了作用域。

垃圾回收

1、當內存中有不再使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數為0的對象,然後清除其在內存的空間。當然除了引用計數為0的會被清除,還有一種情況也會被垃圾收集器清掉:當兩個對象相互引用時,他們本身其他的引用已經為0了。

2、垃圾回收機制還有一個循環垃圾回收器, 確保釋放循環引用對象(a引用b, b引用a, 導致其引用計數永遠不為0)。

4. Python是什麼

Python由荷蘭數學和計算機科學研究學會的Guido van Rossum 於1990
年代初設計,作為一門叫做ABC語言的替代品。Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。
Python解釋器易於擴展,可以使用C或C++(或者其他可以通過C調用的語言)擴展新的功能和數據類型。Python
也可用於可定製化軟體中的擴展程序語言。Python豐富的標准庫,提供了適用於各個主要系統平台的源碼或機器碼。

5. Python是一門怎樣的編程語言

編程語言主要分為編譯型和解釋型,靜態語言和動態語言,強類型和弱類型,混合語言等。

編譯型語言:通過編譯器把源代碼編譯(compile)成機器語言,在經過鏈接(linker)將源代碼中所使用的庫串聯起來生成可執行二進制文件,這樣運行時 計算機可以直接以機器語言來運行程序。優點:運行效率高。缺點:編譯之後如果需要修改代碼需要重新編譯整個模塊。編譯的時候根據對應的運行環境生成機器碼,不同的操作系統之間移植就會有問題,需要根據運行的操作系統環境編譯不同的可執行文件,代表語言:C,C++,object-C等。

解釋型語言:不需要編譯,只在程序運行時才逐條翻譯成機器語言。優點:跨平台支持比較好,缺點:程序運行效率會比較慢。如:python,php,Perl等。

動態語言:動態類型語言,是指數據類型,結構(如對象,函數)的檢查是在運行時做的。用動態類型語言編程時,不用給變數指定數據類型,該語言會在你第一次賦值給變數時,在內部記錄數據類型,結構。在運行代碼時可以根據某些條件改變變數的數據類型,結構。也就是說在運行時代碼 可以根據某些條件改變自身結構,數據類型。代表語言:python,PHP,C#等。

靜態語言:靜態類型語言,是指數據類型,結構的檢查是在運行前(如編譯階段)做的,運行時結構不可變。代表語言:C,C++等。

強類型語言:如果某個變數的數據類型不經過強制轉換,該變數類型是不會改變的。

弱類型語言:變數可以根據賦值類型調整自身的數據類型。

混合型語言:既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來,取其精華去其糟粕。就出現了半編譯型語言。比如C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平台提供了中間語言運行庫運行中間碼,中間語言運行庫類似於Java虛擬機。.net在編譯成IL代碼後,保存在dll中,首次運行時由JIT在編譯成機器碼緩存在內存中,下次直接執行。Java先生成位元組碼再在Java虛擬機中解釋執行。嚴格來說混合型語言屬於解釋型語言。C#更接近編譯型語言。

由此可知python語言是一門解釋,動態,弱類型語言。

相關推薦:《Python視頻教程》

python語言的優點:

1、python的定位是「優雅」、「明確」、「簡單」,所以python程序看上去總是簡單易懂,對於初學者容易入門。

2、開發效率高,python有非常強大的第三方庫,基本上你想通過計算機實現任何功能,python官方庫里都有相應的模塊進行支持,直接下載調用後,在基礎庫的基礎上進行開發,大大降低開發周期,避免重復造輪子。

3、高級語言,當使用python語言編寫程序時,無需考慮如何管理內存等底層細節。

4、可移植性,由於它開源的本質,python已經被移植在許多平台上,如果你小心的避免使用依賴於系統特性,那麼你的所有python程序無需修改就幾乎可以在市場上所有的系統平台運行。

5、可擴展性,如果你需要你的一段關鍵代碼運行得更快或者希望某些演算法不公開,可以把部份程序用C或C++編寫庫,然後用python調用。

6、可嵌入式,可以把python嵌入到C/C++程序,從而向你的程序用戶提供腳本功能。

python語言的缺點:

1、速度慢,由於是解釋型所以運行速度相比編譯型語言要慢,跟Java相比也要慢一些。

2、代碼不能加密,因為python是解釋型語言,它的源碼都是以明文形式存放的,所以如果項目要求源代碼必須保密或者加密,那一開始就不應該考慮用python來實現。

3、強制縮進,單行語句不用寫分號對於習慣了C/C++用戶可能不是太習慣。

4、Python2與 Python3不兼容,因為Python沒有向後兼容,給所有的Python工程師帶來了煩惱。

6. Python的幾種實現

Python自身作為一門編程語言,它有多種實現。這里的實現指的是符合Python語言規范的Python解釋程序以及標准庫等。這些實現雖然實現的是同一種語言,但是彼此之間,特別是與CPython之間還是有些差別的。
下面分別列出幾個主要的實現。
1.CPython:這是Python的官方版本,使用C語言實現,使用最為廣泛,新的語言特性一般也最先出現在這里。
CPython實現會將源文件(py文件)轉換成位元組碼文件(pyc文件),然後運行在Python虛擬機上。
2.J
ython:這是Python的Java實現,相比於CPython,它與Java語言之間的互操作性要遠遠高於CPython和C語言之間的互操作性。
在Python中可以直接使用Java代碼庫,這使得使用Python可以方便地為Java程序寫測試代碼,更進一步,可以在Python中使用Swing等圖形庫編寫GUI程序。
Jython會將Python代碼動態編譯成Java位元組碼,然後在JVM上運行轉換後的程序,這意味著此時Python程序與Java程序沒有區別,只是源代碼不一樣。
在Python 中寫一個類,像使用Java 類一樣使用這個類是很容易的事情。
你甚至可以把Jython 腳本靜態地編譯為Java 位元組碼。
示例代碼:fromjava.langimportSystemSystem.out.write('Hello World!
')
3.Python for .NET:它實質上是CPython實現的
.NET託管版本,它與.NET庫和程序代碼有很好的互操作性。4.
IronPython:不同於Python for .NET,它是Python的C#實現,並且它將Python代碼編譯成C#中間代碼(與Jython類似),然後運行,它與.NET語言的互操作性也非常好。5.
PyPy:Python的Python實現版本,原理是這樣的,PyPy運行在CPython(或者其它實現)之上,用戶程序運行在PyPy之上。它的一個目標是成為Python語言自身的試驗場,因為可以很容易地修改PyPy解釋器的實現(因為它是使用Python寫的)。6.
Stackless:CPython的一個局限就是每個Python函數調用都會產生一個C函數調用。這意味著同時產生的函數調用是有限制的,因此Python難以實現用戶級的線程庫和復雜遞歸應用。一旦超越這個限制,程序就會崩潰。Stackless的Python實現突破了這個限制,一個C棧幀可以擁有任意數量的Python棧幀。這樣你就能夠擁有幾乎無窮的函數調用,並能支持巨大數量的線程。Stackless唯一的問題就是它要對現有的CPython解釋器做重大修改。所以它幾乎是一個獨立的分支。另一個名為Greenlets的項目也支持微線程。它是一個標準的C擴展,因此不需要對標准Python解釋器做任何修改。
下面的這篇文章對Stackless做了比較多的介紹,但是也比較難以讀懂:
可愛的 Python:Python實現內幕

7. python 原理及用法

Python解釋執行原理
 
      這里的解釋執行是相對於編譯執行而言的。我們都知道,使用C/C++之類的編譯性語言編寫的程序,是需要從源文件轉換成計算機使用的機器語言,經過鏈接器鏈接之後形成了二進制的可執行文件。運行該程序的時候,就可以把二進製程序從硬碟載入到內存中並運行。
      但是對於Python而言,python源碼不需要編譯成二進制代碼,它可以直接從源代碼運行程序。當我們運行python文件程序的時候,python解釋器將源代碼轉換為位元組碼,然後再由python解釋器來執行這些位元組碼。這樣,python就不用擔心程序的編譯,庫的鏈接載入等問題了。
      對於python解釋語言,有以下3方面的特性:
每次運行都要進行轉換成位元組碼,然後再有虛擬機把位元組碼轉換成機器語言,最後才能在硬體上運行。與編譯性語言相比,每次多出了編譯和鏈接的過程,性能肯定會受到影響。
由於不用關心程序的編譯和庫的鏈接等問題,開發的工作也就更加輕松啦。
python代碼與機器底層更遠了,python程序更加易於移植,基本上無需改動就能在多平台上運行。
      在具體計算機上實現一種語言,首先要確定的是表示該語言語義解釋的虛擬計算機,一個關鍵的問題是程序執行時的基本表示是實際計算機上的機器語言還是虛擬機的機器語言。這個問題決定了語言的實現。根據這個問題的回答,可以將程序設計語言劃分為兩大類:編譯型語言和解釋型語言。
  編譯實現的語言,如:C、C++、Fortran、Pascal、Ada。由編譯型語言編寫的源程序需要經過編譯,匯編和鏈接才能輸出目標代碼,然後由機器執行目標代碼。目標代碼是有機器指令組成,不能獨立運行,因為源程序中可能使用了一些匯編程序不能解釋引用的庫函數,而庫函數又不在源程序中,此時還需要鏈接程序完成外部引用和目標模板調用的鏈接任務,最後才能輸出可執行代碼。
  解釋型語言,解釋器不產生目標機器代碼,而是產生中間代碼,這種中間代碼與機器代碼不同,中間代碼的解釋是由軟體支持的,不能直接使用在硬體上。該軟體解釋器通常會導致執行效率較低,用解釋型語言編寫的程序是由另一個可以理解中間代碼的解釋程序執行的。和編譯的程序不同的是, 解釋程序的任務是逐一將源代碼的語句解釋成可執行的機器指令,不需要將源程序翻譯成目標代碼再執行。對於解釋型語言,需要一個專門的解釋器來執行該程序,每條語句只有在執行是才能被翻譯,這種解釋型語言每執行一次就翻譯一次,因而效率低下。
  Java解釋器,java很特殊,java是需要編譯的,但是沒有直接編譯成機器語言,而是編譯成位元組碼,然後在Java虛擬機上用解釋的方式執行位元組碼。Python也使用了類似的方式,先將python編譯成python位元組碼,然後由一個專門的python位元組碼解釋器負責解釋執行位元組碼。
  python是一門解釋語言,但是出於效率的考慮,提供了一種編譯的方法。編譯之後就得到pyc文件,存儲了位元組碼。python這點和java很類似,但是java與python不同的是,python是一個解釋型的語言,所以編譯位元組碼不是一個強制的操作,事實上,編譯是一個自動的過程,一般不會在意它的存在。編譯成位元組碼可以節省載入模塊的時間,提高效率。
  除了效率之外,位元組碼的形式也增加了反向工程的難度,可以保護源代碼。這個只是一定程度上的保護,反編譯還是可以的。

8. 零基礎能學會Python嗎

當然可以了,python也算是一門最簡單的開發語言的一種。主要還是全棧語言。

如果你是零基礎,注意是零基礎,想入門編程的話,我推薦你學Python。雖然國內基本上是以C語言作為入門教學,但在麻省理工等國外大學都是以Python作為編程入門教學的。
那麼如何學習Python呢?(文後附錄了學習python快速入門上手視頻)

第一步:學習python的准備開發工作

俗話說得好,磨刀不誤砍柴工,這個你不得不信,反正我信了。那麼怎麼磨刀呢?首先,網路一下Python,對Python有一個大概的了解,然後去官方網站下載一個Python,你最好先下載Python2.7版本,學到最後在去看Python3版本,這符合Python的發展規律,如果你安裝的過程中遇到問題,請自行網路搜索,這個網路一下,我敢肯定你會找到答案的,我相信你。以上說的是在Windows操作系統下安裝。

第二步:先寫一個Hello World,嘗試一把

找到Python的安裝目錄,看到一個python.exe的文件,請用滑鼠雙擊。是不是看到一個黑窗口,請輸入print(「hello world!」),然後按Enter鍵。如果順利,你將看到如下圖所示的窗口。

第三步:學會Python運行的原理

不要怕,原理我可以用簡單的語言告訴你,你不必東北西走的找。我們可以把那個python.exe當成翻譯官(解釋器),當我們輸入print(「hello world」)的時候,翻譯官會把我們的輸入解釋給操作系統,然後操作系統就明白是要向屏幕輸出hello world,其實就是這么簡單。

第四步:學會python如何運行編寫好的腳本文件

緊接著上一步,請把黑窗口關掉,然後再次打開,你會發現你之前輸入的東西都沒有了,怎麼辦?我想保存住之前的輸入怎麼辦?別著急,我來幫你。
現在,請用一個記事本,創建一個純文本文件,保存成hello.py,請把這個hello.py放到c盤根目錄中。

然後,請打開cmd窗口(不知道什麼是cmd?網路一下你就知道,是吧),在窗口輸入python c:\hello.py,如果順利,你會看到類似下圖的樣子。

第五步:跟著老男孩python培訓入門教程開始一步一步學Python

文章後面附錄了最新的alex python入門視頻

第六步:請名師手把手傳授高級Python技能

能獨自走完入門教程的話,恭喜你,你已經進入Python大門。如果你希望用Python技能就業的話,只是入門還是不夠的,請找名師手把手傳授高級Python技能吧。

9. python是什麼東西怎麼使用

Python是一種腳本語言。程序設計語言分為編譯型和解釋型。區別在於是否需要編譯後才能運行。python屬於後者,不需要編譯。類似的還有php,javascript。python文件的後綴名是.py。在命令行模式下使用python <filename>.py 來運行。也可以輸入python進去交互模式。例如最簡單的Helloworld程序,python2使用print 'Hello,world!' Python3的是print('Hello,world!')。更多內容請參考www.python.org

熱點內容
python位元組轉字元串 發布:2025-05-14 07:06:35 瀏覽:420
subplotpython 發布:2025-05-14 06:53:51 瀏覽:661
豎屏大屏導航工廠密碼一般是多少 發布:2025-05-14 06:49:29 瀏覽:806
如何在手機里設置無線網密碼 發布:2025-05-14 06:47:54 瀏覽:120
動態ip文件伺服器 發布:2025-05-14 06:44:22 瀏覽:891
文字分行的腳本有什麼 發布:2025-05-14 06:33:10 瀏覽:288
svn小烏龜怎麼配置 發布:2025-05-14 06:31:43 瀏覽:393
視頻播放器android 發布:2025-05-14 06:31:43 瀏覽:720
android工作室 發布:2025-05-14 06:26:00 瀏覽:658
汽車官方配置表如何下載 發布:2025-05-14 06:21:41 瀏覽:800