Lua 的速度為什麼比 Python 快?

時間 2021-05-07 01:26:23

1樓:eechen

非JIT的動態語言裡,能比Lua快的也只有PHP了吧(不過年底發布的PHP8也加入了JIT)。Python是出了名的慢,效能跟Ruby乙個級別。

2樓:

lua使用的是基於暫存器的虛擬機器,速度當然快了,而luajit又比lua快大概10倍左右。

python的問題主要在GIL全域性鎖上,因為大量的庫受限於GIL鎖,所以python現在也沒有辦法了,只能一條路走到黑。

3樓:

因為python太動態的物件導向特性?lua中型別,除了少數涉及元方法的,指令呼叫時會去查下元表的,基本就是取值,計算了.比如add,直接就是從frame中取出對應slot的lua_Number增加然後pushnumber而已.

就算是call,也就是多個檢查是否__call,建立新frame,差不多就完了進入下一條指令了

4樓:Mcfly

對機器友好和對人友好是乙個鐘擺的兩側。強調對人友好的語言(python),必然對機器不友好(效率低),因為它的很大一部分資源都用於抽象和封裝那些對人不友好的底層細節。反之,執行效率高的語言,必然難以理解和使用。

這就是乙個trade off 。

5樓:Jinhua Luo

python的一些設計特性,例如完全物件導向,同時也是它在效能表現上的負擔。

舉個很簡單的例子:

deftest

():a=1

b=2returna+

b在這個簡單函式裡,a和b在python內部的表示是兩個整數物件,a + b會涉及物件方法add的呼叫。

而lua並非完全物件導向的語言,在lua裡面只有八種基本型別(物件導向特性可以使用元表和表例項來模擬),對於整數型別,在lua內部的表示和C語言是一致的。

function

test

()locala=

1localb=

2returna+

bend

整數相加的實現跟C語言一致:

vmcase

(OP_ADD

)python也好,lua也好,都是通用的程式語言,有很多不同的語言特性,結合到具體專案,有可能相得益彰,也有可能是不必要的負擔,所以要根據具體專案,甚至專案裡面的具體模組而選定合適的程式語言。

6樓:徐波

Python基於純物件的, 任意東西都是物件. 所以數值運算時, 還要進行轉換

lua 最新的5.3 已經支援整數型別, 加上基於暫存器的VM和優秀的編譯器, 想慢都難

7樓:馮東

有一些 PUC-Rio Lua(也就是沒 JIT 的)和 Python 的 benchmark 對比。結論是 Python 比 C 大約慢 70 倍,Lua 大約慢 30-40 倍。

Lua 是 register-based VM。所謂的暫存器,其實並不神秘,就是 runtime stack 的 topmost frame [1] 是可以被 VM 指令隨機訪問的。至於為什麼 CPU 裡的某種硬體也叫暫存器,原因在這裡有解釋:

《什麼是暫存器》。

Stack frame 可以被隨機訪問之後,在同乙個 VM 指令裡就可以用 native code 一次做很多事情。

可以看雲風的這篇 blog:《雲風的 BLOG: 虛擬機器之比較,lua 5 的實現》

@codedump 提到了 single-pass compiler 通過犧牲簡潔性來提高效能。其實我認為在這方面 Lua 對複雜度的控制還是有很好的折衷:Lua 的語言實現難度

Stack frame 就是 stack 中屬於同乙個 function invocation 的所有 stack entries。

為什麼很多人覺得Lua比C 簡單?

Pumpkin lua的確簡單 看上去是很簡單 但你在玩Minecraft的opencomputers模組的時候你就不會那麼想了 不能呼叫C API,lua即該模組計算機的 機器語言 想用其他語言要麼再加mod要麼用lua寫個翻譯器 直譯器 不過我主要是不太習慣動態語言 renyanchao 說一下...

為什麼C getline讀取速度比C readline讀取速度慢這麼多?如何提高?

C 不太了解,不過之前我用C 讀取了乙個五十萬行資料 好像是這麼多吧,檔案一百來兆 用了好久,而Python用readlines幾秒鐘 還是十幾秒?忘記了,反正很快 就出來結果了,我還跑到知乎上問了為什麼哈哈。其實可能執行機制不一樣吧,getline是一行一行的讀,每一次只佔一行的記憶體,而Pyth...

lua 為什麼沒有賦值元方法?

熊起 加乙個間接層次,assign可以用 newindex模擬 t function mt.index t,k return rawget t,member k endfunction mt.newindex t,k,v rawget t,member k vend 其實乙個方案是,使用 newin...