1. 程式人生 > >Python 執行速度慢原因之一一因為它是解釋語言

Python 執行速度慢原因之一一因為它是解釋語言

這條理由我也聽過很多,我發現它過於簡化了 CPython 的實際工作原理。當你在終端上寫 python myscript.py 時,CPython 會啟動一長串操作,包括讀取、詞法分析、語法分析、編譯、解釋以及執行。

如果你對這些過程感興趣,可以看看我之前寫的文章:

6分鐘修改Python語言:https://hackernoon.com/modifying-the-python-language-in-7-minutes-b94b0a99ce14

這個過程的重點就是它會在編譯階段生成.pyc檔案,位元組碼會寫到__pycache__/下的檔案中(如果是Python 3),或者寫到與原始碼同一個目錄中(Python 2)。不僅你編寫的指令碼是這樣,所有你匯入的程式碼都是這樣,包括第三方模組。

因此絕大多數情況下(除非你寫的程式碼只會執行一次),Python是在解釋位元組碼並在本地執行。與Java和C#.NET比較一下:

Java將原始碼編譯成“中間語言”,然後Java虛擬機器讀取位元組碼並即時編譯成機器碼。.NET CIL也是一樣的,.NET的公共語言執行時(CLR)使用即時編譯將位元組碼編譯成機器碼。

那麼,既然它們都使用虛擬機器,以及某種位元組碼,為什麼Python在效能測試中比Java和C#慢那麼多?第一個原因是,.NET和Java是即時編譯的(JIT)。

即時編譯,即JIT(Just-in-time),需要一種中間語言,將程式碼分割成小塊(或者稱幀)。而提前編譯(Ahead of Time,簡稱AOT)是編譯器把原始碼翻譯成CPU能理解的程式碼之後再執行。

JIT本身並不能讓執行更快,因為它執行的是同樣的位元組碼序列。但是,JIT可以在執行時做出優化。好的GIT優化器能找到應用程式中執行最多的部分,稱為“熱點”。然後對那些位元組碼進行優化,將它們替換成效率更高的程式碼。

這就是說,如果你的應用程式會反覆做某件事情,那麼速度就會快很多。此外,別忘了Java和C#都是強型別語言,所以優化器可以對程式碼做更多的假設。

前面說過,PyPy有個JIT,因此它比CPython要快很多。下面這篇效能測試的文章介紹得更詳細:

哪個版本的Python最快?https://hackernoon.com/which-is-the-fastest-version-of-python-2ae7c61a6b2b

那麼為什麼CPython不用JIT?

JIT也有缺點:首先就是啟動速度。CPython的啟動速度已經比較慢了,而PyPy的啟動速度要比CPython慢兩到三倍。Java虛擬機器的啟動速度也是出了名的慢。.NET CLR在系統啟動時啟動,因此避免了這個問題,但這要歸功於CLR和作業系統是同一撥開發者開發的。

如果你有一個Python程序需要執行很長時間,而且程式碼裡包含“熱點”可以被優化,那麼使用JIT就很不錯。

但是,CPython是個通用的實現。因此如果要用Python開發命令列程式,那麼每次都要等待JIT呼叫CLI就特別慢了。

CPython試圖滿足大部分情況下的需求。有一個在CPython中實現JIT(https://www.slideshare.net/AnthonyShaw5/pyjion-a-jit-extension-system-for-cpython)的專案,不過這個專案已經停止很久了。

如果你想要享受JIT的好處,並且要處理的任務適合JIT,那就使用PyPy。

相關推薦

Python 執行速度原因之一因為解釋語言

這條理由我也聽過很多,我發現它過於簡化了 CPython 的實際工作原理。當你在終端上寫 python myscript.py 時,CPython 會啟動一長串操作,包括讀取、詞法分析、語法分析、編譯、解釋以及執行。 如果你對這些過程感興趣,可以看看我之前寫的文章: 6分

Python 執行速度原因之一一GIL(全域性直譯器鎖)視覺化

因為它是GIL(全域性直譯器鎖) 現代計算機的 CPU 有多個核心,有時甚至有多個處理器。為了利用所有計算能力,作業系統定義了一個底層結構,叫做執行緒,而一個程序(例如 Chrome瀏覽器)能夠生成多個執行緒,通過執行緒來執行系統指令。這樣如果一個程序是要使用很多 CPU,

Python執行速度這點是公認的!那麼如何加速Python程式碼呢?

  通過使用jit裝飾器,使用Numba非常容易:     正如你所知道的,在Python中,所有程式碼塊都被編譯成位元組碼:   當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢?

Python執行速度!這點是公認的,加上這操作快N倍!你信嗎?

  開箱即用的Numba使用以下方法: 作業系統:Windows(32位和64位),OSX和Linux(32位和64位) 架構:x86,x86_64,ppc64le。 在armv7l,armv8l(aarch64)上進行實驗。 GPU:Nvidia CUDA

為啥 Python 執行速度這麼

作者:Anthony Shaw 是 Python 軟體基金會成員和 Apache 基金會成員。 近來Python可謂人氣驟升。這門程式語言用於開發運維(DevOps)、資料科學、網站開發和安全。 然而,它沒有因速度而贏得任何獎牌。 Java在速度方面與C、C++

java常見執行速度優化

1.排查是否有迴圈操作資料庫,如果有改為批量插入或者更新; 2.排查是否有迴圈操作資料庫,改為一次性查詢資料庫得到所有結果,使用map來快取結果後操作(如通過code來查詢name); 3.排查是否迴圈呼叫微服務,改為一次性呼叫微服務並用map來快取結果; 4.採用spring cach

Tomcat啟動原因之一 At least one JAR was scanned for TLDs yet contained no TLDs

Tomcat啟動時提示: 資訊: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were s

還在抱怨pandas執行速度?這幾個方法會顛覆你的看法

前言 當大家談到資料分析時,提及最多的語言就是Python和SQL。Python之所以適合資料分析,是因為它有很多第三方強大的庫來協助,pandas就是其中之一。pandas的文件中是這樣描述的: “快速,靈活,富有表現力的資料結構,旨在使”關係“或”標記“資料的使用既簡單又直觀。”

Windows + PyPy 執行python:提高python執行速度

pypy是python的一種直譯器,執行python的速度比標準python快很多。 1.下載pypy並新增環境變數 根據自己的python版本在官網下載pypy。我的python是32位的3.5.0,因此下載“Python 3.5.3 compatible PyPy

採用Psyco實現python執行速度提高到與編譯語言一樣的水平

本文例項講述了採用Psyco實現python執行速度提高到與編譯語言一樣的水平的方法,分享給大家供大家參考。具體實現方法如下: 一、安裝Psyco很簡單,它有兩種安裝方式,一種是原始碼方式,一種是二進位制碼方式: 如果用原始碼方式安裝,你需在原始碼的目錄中呼叫python setup.py install

"你們不要學pythonpython執行效率,去學XX吧"

當我們終於下定決心想要學習python的時候,身邊的人(學長,同行,所謂的大牛)可能會跟我們這樣講。"你們不要學python,python執行效率慢,去學GoC++C吧",又讓我們好不容易下定的決心又面臨一次猶豫抉擇。事實真的是這樣嗎? 是真的,也不是真的。為什麼這樣說呢?下面慢慢講

SpringBoot 釋出到Tomcat執行報錯原因之一

2、當版本號為:2.0.3.RELEASE在Tomcat8中執行正常在Tomcat7中會報異常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultValidator' d

如何解決Python執行速度問題?

通常Java的速度比Python快些。Python呼叫C擴充套件除外(也可以直接用CPython)。對於Python速度太慢的批評,Python語言作者Guido van Rossum說:如果你開發的系統發現了效能瓶頸,通常最有效率的做法是找到出問題的程式碼塊,用速度較快的語

Python執行速度提升

相比較C,C++,python一直被抱怨執行速度很慢,實際上python的執行效率並不慢,而是直譯器Cpython執行效率很差。 通過使用numba庫的jit可以讓python的執行速度提高百倍以上。 同諾簡單累加,相乘的例子,可以看出。 #!/usr/bin/env

解決電腦執行速度的方法

1、縮短等待時間  開啟登錄檔編輯器(開始——執行——輸入regedit按確定),找到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control,將WaitToKillServiceTimeout設為:1000或更小(原設定值:20

Python 執行sql條件查詢語句速度的解決方法

問題描述 今天寫程式碰到一個問題,程式剛開始執行的好好的,到了後面,資料庫中的檔案越來越多的時候,程式執行開始變慢,到了後來, 一條條件查詢語句,竟然要用一分鐘之久,要知道只有幾萬條資料(雖然資料內容很大) 解決方法 這個問題,困擾我好久,我之前一直在優化自

java執行速度相比較原因

本文主要說明java和C++兩種語言的執行速度差異較大的原因(借鑑自維基百科)。 java是解釋性語言,java程式在執行時,不像C++那樣直接被編譯成機器碼進行執行,而是類載入器從類路經中載入相關

python 控制檯cmd執行出現亂碼(原因之一

源程式中有中文字元: cmd控制檯輸出結果: 導致原因: 檢視控制檯編碼格式:cmd視窗頂部右擊--》屬性--》選項--》活動編碼為65001(utf-8) 用命令 chcp 936  將其更改為gbk格式 執行程式ok,搞定

分鐘解決上網速度的問題

計算機配置 電腦系統 數據包 程序 沖浪 不要抱怨網速慢,只怪你自己不會調快網速?! 電腦系統都會默認限制20%的網速,我們可以很輕松地解除這個限制,使你的上網速度達到100%,真正地體驗沖浪的感覺.方法如下:開始菜單-運行-輸入"gpedit.msc”-確定-計算機配置-管理模板-網絡-

數據庫查詢速度了?是否是因為死鎖了?種解決死鎖的方法。

-- 檢索 blog kill _id exe 進行 xxx 通過 --查詢哪些表被死鎖 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sy