10

我运行完全相同的 Python 函数,一个作为 PostgreSQL PL/Python,另一个在 PostgreSQL 之外作为常用的 Python 脚本。

令人惊讶的是,当我使用 调用 PostgreSQL PL/Pythonselect * from pymax7(20000);时,平均需要 65 秒,而当我调用通常的 Python 脚本python myscript.py 20000时,平均需要 48 秒。运行查询和脚本 10 次计算平均值。

应该预期这样的差异吗?PostgreSQL RDBMS (PL/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()
4

1 回答 1

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 毫秒。

于 2013-05-16T12:59:59.203 回答