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()
So sánh với các ngôn ngữ PL khác sẽ công bằng hơn. –
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ì đó? –
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). –