2013-05-15 17 views
5

Tôi chạy chính xác chức năng Python, một như một PostgreSQL PL/Python, và một cái khác bên ngoài PostgreSQL như một tập lệnh Python thông thường.Làm thế nào để PostgreSQL PL/Python so sánh với Python bên ngoài nó về mặt biểu diễn?

Đáng ngạc nhiên, khi tôi gọi PostgreSQL PL/Python sử dụng select * from pymax7(20000);, mất trung bình 65 giây, trong khi tôi gọi kịch bản Python thông thường python myscript.py 20000 mất trung bình 48 giây. Trung bình được tính toán chạy các truy vấn và tập lệnh 10 lần.

Nên có sự khác biệt như vậy? Làm thế nào để Python bên trong PostgreSQL RDBMS (PL/Python) so sánh với Python bên ngoài nó về mặt biểu diễn?

Tôi đang chạy PostgreSQL 9.1 và Python 2.7 trên 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

So sánh với các ngôn ngữ PL khác sẽ công bằng hơn. –

+1

Vì PL/x gọi trình thông dịch cho x (x = Python; Perl; vv), có phải đó là một sự so sánh thú vị để đánh giá mức phí trên PL/x vượt quá x? Trừ khi tôi đang thiếu một cái gì đó? –

+0

Nó sẽ không gọi trình thông dịch có thể thực thi được, nó sẽ liên kết ngôn ngữ đích bằng cách sử dụng các cơ chế nhúng (trong trường hợp của Python, liên kết động với các thư viện python, tôi đoán). –

Trả lời

4

Không nên có bất kỳ sự khác biệt. Cả hai trường hợp thử nghiệm của bạn có khoảng thời gian chạy cùng đối với tôi, 53 giây cộng hoặc trừ 1.

tôi đã điều chỉnh trường hợp thử nghiệm PL/Python để sử dụng kỹ thuật đo tương tự như các trường hợp thử nghiệm Python đồng bằng:

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; 

Điều này sẽ cho bạn biết nếu có bất kỳ chi phí nào không liên quan đến Python. FWIW, đối với tôi, sự khác biệt giữa nội dung được in và những gì psql trên máy khách được in dưới dạng tổng thời gian luôn nhỏ hơn 1 mili giây.

+0

Cảm ơn Peter, thú vị! Bạn có thể vui lòng cho tôi biết phiên bản PostgreSQL, Python và hệ điều hành nào bạn sử dụng không? Tôi đã chạy thử nghiệm một lần nữa trên một thương hiệu mới Ubuntu 12.04 64 bit với PostgreSQL 9.1 và Python 2.7.3 như trong câu hỏi ban đầu, tôi vẫn có sự khác biệt thời gian chạy. Có lẽ điều này là do thực tế là PostgreSQL 9.1 (phát hành vào ngày 2011-09-12) nhúng một số phiên bản cũ hơn của Python so với Python 2.7.3 tôi sử dụng (phát hành vào 2012-08-01). –

+0

Mặc dù PostgreSQL 9.1 dường như sử dụng Python 2.7: http://packages.debian.org/sid/postgresql-plpython-9.1 (tại sao gói cần dep: libpython2.7 (> = 2.7) trong khi PostgreSQL nhúng CPython?) –

+1

Tôi đã thử nghiệm với PostgreSQL 9.2 (với Ubuntu 12.10 lần này), tôi vẫn có sự khác biệt thời gian chạy trên máy chủ của mình (mặc dù tổng thể nhanh hơn 10%, có thể do một số phiên bản CPython mới). Tôi sử dụng máy ảo, vì vậy có lẽ điều này có thể can thiệp mặc dù tôi sẽ không hiểu tại sao. Tôi cũng đã thử sử dụng 'plpython3u', nó chậm hơn nhiều (88 giây), nhưng khi chạy kịch bản Python bằng cách sử dụng' python3' nó cũng chậm hơn (75 giây) và dù sao tôi vẫn có sự khác biệt thời gian chạy, đó là trọng tâm của chủ đề này. –

Các vấn đề liên quan