作者 | Vincent 編譯 | 蘇宓
出品 | CSDN(ID:CSDNnews)
兩年前,Swift 之父、編譯器大神 Chris Lattner 和 Google 前員工 Tim Davis 組隊創立了初創公司 Modular,推出了高性能編程語言 Mojo。憑借“比 Python 快 90000 倍”的驚人宣傳語,Mojo 成為整個開發者社區關注的焦點,被認為是“可能徹底改變 Python 命運”的新語言。
Chris Lattner 曾這樣描述 Mojo:“ 它是 Python 家族的一員,汲取了所有這些酷炫的語言、編譯器和其他技術,讓 Python 向前邁進了一大步。我們認為它增強了 Python 的能力,賦予 Python 程序員超能力,讓熟悉 Python 的人能夠學習新知識,探索并征服新領域,而無需轉用 C++。”
而如今,Chris Lattner 低調放出了一個意味深長的新變化:Python 現在可以直接調用 Mojo 代碼了。
AI 產品爆發,但你的痛點解決了嗎?8.15-16 北京威斯汀·全球產品經理大 會 PM-Summit,3000+ AI 產品人社群已就位。
直面 AI 落地難題、拆解頭部案例、對接精準資源!
掃碼登記信息,添加小助手進群,搶占 AI 產品下一波紅利:
進群后,您將有機會得到:
· 最新、最值得關注的 AI 產品資訊及大咖洞見
· 獨家視頻及文章解讀 AGI 時代的產品方法論及實戰經驗
· 不定期贈送 AI 產品干貨資料和秘籍
Mojo 正在被 Python 調用
據開發者 Vincent D. Warmerdam 的實測,Python 調用 Mojo 現在變得非常簡單,詳細步驟如下。
首先,可以直接用 uv 安裝:
uv pip install modular --index-url https://dl.modular.com/public/nightly/python/simple/
然后你可以創建一個 .mojo 文件,導出一個計算階乘的函數 factorial(),內容如下:
# mojo_module.mojo
from python import PythonObject
from python.bindings import PythonModuleBuilder
import math
from os import abort
@export
fn PyInit_mojo_module() -> PythonObject:
try:
var m = PythonModuleBuilder("mojo_module")
m.def_function[factorial]("factorial", docstring="Compute n!")
return m.finalize()
except e:
return abort[PythonObject](String("error creating Python Mojo module:", e))
fn factorial(py_obj: PythonObject) raises -> PythonObject:
var n = Int(py_obj)
var result = 1
for i in range(1, n + 1):
result *= i
return result
然后你就可以在 Python 中加載它:
# main.py
import max.mojo.importer
import os
import sys
import time
import math
sys.path.insert(0, "")
import mojo_module
start = time.time()
print(mojo_module.factorial(10))
end = time.time()
print(f"Time taken: {end - start} seconds for mojo")
start = time.time()
print(math.factorial(10))
end = time.time()
print(f"Time taken: {end - start} seconds for python")
運行結果如下:
3628800
Time taken: 3.0279159545898438e-05 seconds for mojo
3628800
Time taken: 5.0067901611328125e-06 seconds for python
一切運行正常。
問題顯現
不過,在實測時,Vincent 也注意到了一些問題,對于 factorial(10) 這樣的輕量計算,Mojo 與 Python 本身速度相差無幾。但當輸入擴大到 factorial(100) 時,Mojo 返回的結果卻是錯誤的(輸出為 0),而 Python 的結果則是正確的。
0
Time taken: 2.7894973754882812e-05 seconds for mojo
188267717688892609974376770249160085759540364871492425887598231508353156331613598866882932889495923133646405445930057740630161919341380597818883457558547055524326375565007131770880000000000000000000000000000000
Time taken: 9.298324584960938e-06 seconds for python
這可能是 Mojo 側溢出的結果。文檔也提到這整套系統還處于早期階段,說明其數值系統尚不成熟。
另一個例子
考慮到上面的問題可能是溢出引起的,Vincent 又試了一個例子來看看能不能測出加速效果。這次是一個樸素的素數統計實現。Mojo 代碼如下:
from python import PythonObject
from python.bindings import PythonModuleBuilder
import math
from os import abort
@export
fn PyInit_mojo_module() -> PythonObject:
try:
var m = PythonModuleBuilder("mojo_module")
m.def_function[count_primes]("count_primes", docstring="Count primes up to n")
return m.finalize()
except e:
return abort[PythonObject](String("error creating Python Mojo module:", e))
fn count_primes(py_obj: PythonObject) raises -> PythonObject:
var n = Int(py_obj)
var count: Int = 0
for i in range(2, n + 1):
var is_prime: Bool = True
for j in range(2, i):
if i % j == 0:
is_prime = False
break
if is_prime:
count += 1
return count
對應的 Python 測試代碼如下,此外 Vincent 還加了一個 NumPy 實現做對比:
import numpy as np
import max.mojo.importer
import os
import sys
import time
import math
sys.path.insert(0, "")
import mojo_module
def count_primes(n):
count = 0
for i in range(2, n + 1):
is_prime = True
for j in range(2, i):
if i % j == 0:
is_prime = False
break
if is_prime:
count += 1
return count
def count_primes_numpy(n):
if n < 2:
return 0
candidates = np.arange(2, n + 1)
is_prime_mask = np.ones(len(candidates), dtype=bool)
for idx, candidate in enumerate(candidates):
if candidate == 2:
continue
divisors = np.arange(2, candidate)
has_divisor = np.any(candidate % divisors == 0)
if has_divisor:
is_prime_mask[idx] = False
return np.sum(is_prime_mask)
n = 20_000
start = time.time()
print(count_primes(n))
end = time.time()
print(f"Time taken: {end - start} seconds for python")
start = time.time()
print(count_primes_numpy(n))
end = time.time()
print(f"Time taken: {end - start} seconds for numpy")
start = time.time()
print(mojo_module.count_primes(n))
end = time.time()
print(f"Time taken: {end - start} seconds for mojo")
運行結果如下:
Python 原生實現耗時:約 0.45 秒
NumPy 實現耗時:約 0.26 秒
Mojo 實現耗時:僅 0.01 秒
2262
Time taken: 0.44585609436035156 seconds for python
2262
Time taken: 0.25995898246765137 seconds for numpy
2262
Time taken: 0.011101961135864258 seconds for mojo
盡管這一 benchmark 并非最優算法,但結果仍然具備參考價值:在這種純 CPU 密集型的計算任務中,Mojo 的性能提升確實相當明顯,尤其是與 NumPy 相比也有數量級上的優勢。
整體而言,通過實測,Vincent 發現,Mojo 的語法風格延續了 Python 的簡潔性,同時具備編譯語言的性能與類型系統。
不過,Mojo 當前仍處于早期階段。文檔覆蓋不全、標準庫功能有限、整套開發體驗尚不穩定……這也意味著距離“生產可用”還有距離。
但從 Modular 的近期動作可以看出,該團隊正在有意識地為 Python 社區打造“融合路徑”——不是簡單地“替代 Python”,而是圍繞其生態做加速和增強。這種“擁抱兼容”的姿態或許更務實,也更容易獲得社區的接納。
對此,Vincent 評價道,「現在還不能稱得上“生產可用”,但我已經更有信心了 —— 夢想確實正在靠近。」
原文:https://koaning.io/posts/giving-mojo-a-spin/
2025 全球產品經理大會
8 月 15–16 日
北京·威斯汀酒店
2025 全球產品經理大會將匯聚互聯網大廠、AI 創業公司、ToB/ToC 實戰一線的產品人,圍繞產品設計、用戶體驗、增長運營、智能落地等核心議題,展開 12 大專題分享,洞察趨勢、拆解路徑、對話未來。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.