PostgreSQL PL / Python如何在性能方面与Python之外的Python进行比较?

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

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

是否应该有这样的差异? 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()
最佳答案
应该没有任何区别.两个测试用例对我来说都有大约相同的运行时间,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毫秒.

相关文章

Python中的函数(二) 在上一篇文章中提到了Python中函数的定...
Python中的字符串 可能大多数人在学习C语言的时候,最先接触...
Python 面向对象编程(一) 虽然Python是解释性语言,但是它...
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定...
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非...
在windows下如何快速搭建web.py开发框架 用Python进行web开发...