2013-05-15 10 views
5

Ich führe genau die gleiche Python-Funktion aus, eine als PostgreSQL PL/Python und die andere außerhalb von PostgreSQL als normales Python-Skript.Wie steht PostgreSQL PL/Python im Vergleich zu Python in Bezug auf die Leistung?

Überraschenderweise, wenn ich die PostgreSQL PL/Python mit select * from pymax7(20000); aufrufen, dauert es im Durchschnitt 65 Sekunden, während, wenn ich das übliche Python-Skript python myscript.py 20000 aufrufen dauert es durchschnittlich 48 Sekunden. Die Durchschnittswerte wurden berechnet, indem die Abfragen und Skripts zehn Mal ausgeführt wurden.

Sollte ein solcher Unterschied erwartet werden? Wie vergleicht Python innerhalb des PostgreSQL-RDBMS (PL/Python) mit Python in Bezug auf Performances?

Ich benutze PostgreSQL 9.1 und Python 2.7 auf Ubuntu 12.04 64bits.

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

Vergleich mit anderen PL-Sprachen wäre fairer. –

+1

Da PL/x den Interpreter für x (x = Python; Perl; etc) aufruft, ist es nicht ein interessanter Vergleich, um zu beurteilen, wie viel Overhead PL/x über x hat? Es sei denn, ich verpasse etwas? –

+0

Es wird den Interpreter nicht ausführbar nennen, es bindet die Zielsprache mit Hilfe von Einbettungsmechanismen (im Fall von Python, denke ich dynamisch an Python-Bibliotheken). –

Antwort

4

sollte es keinen Unterschied sein. Ihre beiden Testfälle haben etwa die gleiche Laufzeit für mich, 53 Sekunden plus oder minus 1.em

Ich habe den PL/Python Testfall anpassen, um die gleichen Messverfahren wie die Ebene Python Testfall zu verwenden:

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; 

Dies würde Ihnen sagen, ob irgendwelche Nicht-Python-Overhead beteiligt sind. FWIW, für mich war der Unterschied zwischen dem, was gedruckt wurde und was psql auf dem Client als Gesamtzeit gedruckt wurde, konsistent weniger als 1 Millisekunde.

+0

Danke Peter, interessant! Könnten Sie mir bitte sagen, welche Version von PostgreSQL, Python und OS Sie verwenden? Ich habe den Test nochmal auf einem brandneuen Ubuntu 12.04 64bit mit PostgreSQL 9.1 und Python 2.7.3 durchgeführt wie in der Originalfrage, ich habe immer noch den Laufzeitunterschied. Vielleicht liegt das an der Tatsache, dass PostgreSQL 9.1 (veröffentlicht am 12.09.2011) einige ältere Python-Versionen einbettet als die Python 2.7.3, die ich verwende (veröffentlicht am 01.08.2012). –

+0

PostgreSQL 9.1 scheint Python 2.7 zu verwenden: http://packages.debian.org/sid/postgresql-plpython-9.1 (warum benötigt das Paket dep: libpython2.7 (> = 2.7) Während PostgreSQL CPython einbettet?) –

+1

Getestet mit PostgreSQL 9.2 (mit Ubuntu 12.10 dieses Mal), habe ich immer noch den Laufzeitunterschied auf meinem Server (obwohl insgesamt 10% schneller, wahrscheinlich aufgrund einer neuen Version von CPython). Ich benutze virtuelle Maschinen, vielleicht kann das stören, obwohl ich nicht verstehen würde warum. Ich habe auch versucht, 'plpython3u' zu verwenden, es ist viel langsamer (88 Sekunden), aber wenn das Python-Skript mit' python3' ausgeführt wird, ist es auch langsamer (75 Sekunden) und trotzdem habe ich immer noch den Laufzeitunterschied, was der Fokus ist von diesem Thread. –