2011-05-27 96 views
9

需要花費數小時將pypy實現轉換爲c文件,並在具有2G內存和Intel Core2 2GHz CPU的現代筆記本電腦上構建pypy-c。爲什麼PyPy翻譯如此緩慢?

我知道這是一個cpu密集型任務,但它是否必須如此緩慢?是否有機會或空間來減少計算,重新安排計算順序並將時間減少到幾十分鐘?

回答

12

免責聲明:我不是PyPy專家 - 特別是,我不明白RPython翻譯的細節,我只列舉docs什麼overheared在郵件列表,並在博客上。

「CPU密集型任務」?本月低估提名。我自己並不十分理解翻譯過程的細節,但即使我可以告訴你,它的每個分析和優化過程都會對很多代碼做很多非常複雜的工作。

  1. 它開始正常運行Python代碼,例如,導入模塊,執行模塊級變量定義,定義函數和類,應用裝飾器等等。在某些時候,當「足夠靜態」應該被實現時,它停止並繼續實際的翻譯過程。
  2. 它採用凍結的內存中正在進行的Python程序,並將其全部運行在模擬流量控制,變量的可能值等的特殊對象空間中。它本質上是象徵性地運行解釋器!它這樣做是爲了執行類型推斷(在像Python這樣的語言中一切都很簡單)和附加分析。
  3. 結果被轉換爲低級代碼。
  4. 可選地,大量的優化(默認情況下啓用,我猜)和一個複雜的無棧支持轉換(默認情況下禁用,我猜)遵循。
  5. 然後它將所有東西放到適合指定後端的類型系統中,生成數百萬行代碼(從最近的郵件列表條目看來,至少有19個.c文件,並且其中至少有一個包含至少247,560行 - 就是讓你對我們正在談論的數量級有所瞭解)。
  6. 所有的代碼都是用gcc -O2或類似的代碼編譯的,當然這些代碼有很多解析和檢查工作,而且本身會有許多分析和優化工作要做。

所以是的,這是一個相當嚇人的巨大任務。難怪你的弱小CPU丟失了。作爲參考,當benchmarking the translation process in November 2010時,PyPy人使用了Intel Xeon W3580(3.33 GHz)。它仍然花費了大約76分鐘,即使它們也有12 GB的RAM - 這導致了下一個問題:在此過程中需要很多RAM的(64位Ubuntu上2.3 GB的時候,不知道數字如何轉化爲你的情況)。我很肯定你最終會超過你的體能內存 - 輸入過多的交換和相關的踢到性能的腹股溝。

結合你可以有幾個其他程序運行竊取CPU時間和內存的事實,在我看來,你的體驗非常好。翻譯PyPy保留給更強大的計算機。如果有什麼能夠從根本上改善這些時間,像我們這樣的外部人士不太可能找到它。我會把這些問題留給開發者。

+1

感謝您的快速回答。由於我沒有太多內存,所以我使用官方的python來運行翻譯,這可能使得這個過程比根據文檔應該更長,但是我確實在我的可憐的機器上成功地構建了pypy。 – jaimechen 2011-05-27 18:24:06

相關問題