2013-05-15 19 views
5

我運行完全相同的Python函數,一個作爲PostgreSQL PL/Python,另一個作爲通常的Python腳本運行在PostgreSQL之外。令人驚訝的是,當我使用select * from pymax7(20000);調用PostgreSQL PL/Python時,平均需要65秒,而當我調用通常的Python腳本python myscript.py 20000時,平均需要48秒。計算平均值運行查詢和腳本10次。在性能方面,PostgreSQL PL/Python如何與Python之外的Python進行比較?

應該有這樣的區別嗎?在性能方面,PostgreSQL RDBMS(PL/Python)中的Python如何與Python之外的Python進行比較?

我在Ubuntu 12.04 64位上運行PostgreSQL 9.1和Python 2.7。

PostgreSQL的PL/Python的:

CREATE FUNCTION pymax7 (b integer) 
    RETURNS float 
AS $$  
    a = 0 
    for i in range(b): 
    for ii in range(b): 
     a = (((i+ii)%100)*149819874987) 
    return a 
$$ LANGUAGE plpythonu; 

的Python:

import time 
import sys 

def pymax7 (b):  
    a = 0 
    for i in range(b): 
     for ii in range(b): 
      a = (((i+ii)%100)*149819874987) # keeping Python busy 
    return a 

def main():  
    numIterations = int(sys.argv[1])   
    start = time.time() 
    print pymax7(numIterations) 
    end = time.time() 
    print "Time elapsed in Python:" 
    print str((end - start)*1000) + ' ms'   

if __name__ == "__main__": 
    main() 
+0

與其他PL語言的比較會更公平。 –

+1

由於PL/x調用x(x = Python; Perl;等)的解釋器,估計PL/x對x有多少開銷,這不是一個有趣的比較嗎?除非我錯過了什麼? –

+0

它不會調用解釋器可執行文件,它會使用嵌入機制(在Python的情況下,動態鏈接到python庫,我猜)綁定目標語言。 –

回答

4

應該沒有任何區別。無論你的測試用例具有大致相同的運行時間對我來說53秒加或減1

我做了調整PL/Python的測試情況下使用相同的測量技術爲普通的Python測試案例:

CREATE FUNCTION pymax7a (b integer) 
    RETURNS float 
AS $$ 
    import time 
    start = time.time() 
    a = 0 
    for i in range(b): 
    for ii in range(b): 
     a = (((i+ii)%100)*149819874987) 
    end = time.time() 
    plpy.info("Time elapsed in Python: " + str((end - start)*1000) + ' ms') 
    return a 
$$ LANGUAGE plpythonu; 

這會告訴你是否存在任何非Python開銷。 FWIW,對我來說,這個打印和客戶端上打印的psql之間的差別總的時間始終小於1毫秒。

+0

感謝Peter,很有趣!你能告訴我你使用的是哪個版本的PostgreSQL,Python和OS?我已經使用PostgreSQL 9.1和Python 2.7.3在全新的Ubuntu 12.04 64位上再次運行測試,就像在原始問題中一樣,我仍然有運行時差異。也許這是由於PostgreSQL 9.1(2011-09-12發佈)嵌入了Python的一些老版本,而不是我使用的Python 2.7.3(2012-08-01發佈)。 –

+0

儘管PostgreSQL 9.1似乎使用Python 2.7:http://packages.debian.org/sid/postgresql-plpython-9.1(爲什麼包需要dep:libpython2.7(> = 2。7)而PostgreSQL嵌入CPython?) –

+1

我測試了PostgreSQL 9.2(這次是Ubuntu 12.10),我的服務器仍然有運行時差異(儘管整體速度提高了10%,可能是由於一些新版本的CPython)。我使用虛擬機,所以也許這會干擾,但我不明白爲什麼。我也嘗試過使用'plpython3u',但速度要慢很多(88秒),但是使用'python3'運行Python腳本時速度也會更慢(75秒),而且我仍然有運行時差異,這是焦點這個線程。 –