2010-07-02 56 views
19

我有一個巨大的語法開發pyparsing作爲一個大的,純粹的Python應用程序的一部分。 我已經達到了性能調整的極限,而我正處於收益遞減使我開始尋求其他地方的地步。是的,我想我知道大部分的提示和技巧,我已經將我的語法和應用程序歸類爲灰塵。pyparsing後的內容?

下一步是什麼?我希望找到一個解析器,它給了我相同的可讀性,可用性(我使用pyparsing的許多高級特性,例如parse-actions來啓動正在被解析的輸入的後處理)和python集成,但是在10×性能

我喜歡語法是純Python的事實。

我所有的基本塊都是正則表達式,所以重用它們會很好。

我知道我不能擁有所有東西,所以我願意放棄我今天獲得所需10倍性能的一些功能。

我該從哪裏出發?

+0

優化您的使用http://cython.org/ – jvitoroc 2018-02-07 01:26:33

回答

6

它看起來像pyparsing夥計們已經預料到你的問題。從http://pyparsing.wikispaces.com/HowToUsePyparsing

pyparsing性能可能是複雜的語法和/或大的輸入字符串緩慢。 psyco包可用於提高pyparsing模塊的速度,而不改變語法或程序邏輯 - 觀察到的改進已經在20-50%的範圍內。

然而,正如Vangel在下面的評論中指出,psyco是一個過時的項目爲2012年3月的其後續產品是PyPy項目,該項目從相同的基本方法開始表現:使用JIT本機代碼編譯而不是字節碼解釋器。如果切換Python實現可以爲您工作,您應該能夠通過PyPy獲得相似或更大的收益。

如果你真的是速度惡魔,但想保留一些可讀性和聲明性語法,我建議看看ANTLR。可能不是生成Python的後端;我懷疑這是成熟還是高性能,足以滿足您的需求。我在談論這些商品:C後端開始了這一切。

將Python C擴展模塊包裝到解析器的入口點,並將其鬆動。如上所述,在這種轉換中你將放棄很多:基本上你想在解析器中執行的任何Python都必須通過C API完成(而不是完全漂亮)。另外,你必須習慣於非常不同的做事方式。 ANTLR有它的魅力,但它不是基於combinators的,所以你的語法和你的語言之間沒有簡單而流暢的關係。另外,這是它自己的DSL,就像lex/yacc一樣,它可以呈現一條學習曲線 - 但是,因爲它是基於LL的,所以您可能會更容易適應您的需求。

+0

psyco已經死了,不再維護。但是,我發現PyPy並試一試。 2013年的答案? – Vangel 2013-05-08 00:26:18

+2

@Vangel - 看看http://www.cython.org – Russ 2013-05-15 16:17:23

+0

是的,我確實看過了cython,但是我無法將自己的頭圍繞在如何在這裏使用python程序進行cython工作。顯然,pyparsing和cython已經準備好了,但是它在python 3.0的2.x pyparsing分支中,或者我現在完全感到困惑。 – Vangel 2013-05-15 17:00:58

1

沒有辦法知道在沒有測試的情況下你會得到什麼樣的好處,但是如果你的過程是長時間運行和重複的,那麼你可以從使用Unladen Swallow獲得10倍的好處。(另外,如果你有很多事情需要解析,你通常會爲每個解釋器啓動一個新的解釋器,Unladen Swallow會變得更快 - 到一定程度 - 運行流程的時間越長,因此在解析一個輸入時可能無法獲得太多收益,在同一過程中的第二和第三輸入獲得顯着收益)。

(注:拉最新出SVN的 - 你會得到比最新的壓縮包更好的性能)(使用ANTLR,柔性/野牛等)

+0

尼克 - 我開始閱讀有關美國的內容,在安裝,編譯和構建過程中,我遇到了Pycon2010演示基準。我沒有看到任何基準,甚至比CPython 2.6.4增加了2倍!你爲什麼期望更好?也就是說,這是最簡單的選擇,所以我不妨試試它... – 2010-07-03 22:20:39

+0

@Tal:我個人的經歷,真的(能夠在某些解析代碼上獲得3.5-4倍的速度提升)。美國的基準測試是真實世界的基準測試,這很有用,但是他們錯過了重新設計代碼以從美國受益更多的好處 - 特別是通過創建一個長期運行的流程而不是一堆短期流程來完成您的工作。當我進行解析測試時,解析一個文件的差異很小 - 可能快5-10% - 但到第10個文件通過同一個解析器進程提供時,它的運行速度快了近400%。 – 2010-07-04 01:13:53

2

切換到一個生成的C/C++語法分析器。如果您可以延遲執行所有動作規則,直到解析完成後,您可能可以使用普通代碼構建AST,然後通過類似SWIG的方式將其傳回給您的Python代碼,並使用當前的操作規則處理它。 OTOH,爲了讓你提高速度,解析必須是繁重的工作。如果你的行爲規則是巨大的成本,那麼除非你用C語言編寫你的行爲規則,否則這將不會爲你購買任何東西(但是你可能必須這樣做才能避免支付python和C代碼之間的任何阻抗不匹配) 。

2

如果你真的想要大文法的性能,看看沒有比SimpleParse(它本身依賴mxTextTools,一個C擴展)更遠。但是,現在知道它的代價是更加神祕,並且要求您精通EBNF

這絕對不是Pythonic的路線,你將不得不從EBNF語法開始使用SimpleParse。