LINUX.ORG.RU

История изменений

Исправление annerleen, (текущая версия) :

import psycopg2
import psycopg2.extras

conn = psycopg2.connect(dbname='', user='', password='', host='localhost')

cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
for i in range(23480):
    cur.execute( "select users.*, %s as testarr from users where users.id=%s", ([1,2,3],0) )
    for row in cur:
        assert row["login"] == 'root'
        assert isinstance(row['testarr'], list)

conn.close()


# time python3 python.py 

real	0m4.350s
user	0m1.572s
sys	0m0.444s

#!/usr/bin/ruby

require 'pg'

begin

    con = PG.connect :dbname => '', :user => '', :password => ''
    arr_dec = PG::TextDecoder::Array.new()
    23480.times do
        rs = con.exec_params "select users.*, $1 as testarr from users where users.id=$2", [[1,2,3], 0]
        rs.each do |row| 
            raise "assert failed 1" unless row["login"] == 'root' 
            raise "assert failed 2" unless arr_dec.decode(row["testarr"]).kind_of?(Array) 
        end
    end

rescue PG::Error => e

    puts e.message 
    
ensure

    con.close if con
    
end

# time ruby ruby.rb 

real	0m3.193s
user	0m0.528s
sys	0m0.188s


И это ещё используем prepared statements в Ruby. Без них ещё быстрее.

Исходная версия annerleen, :

import psycopg2
import psycopg2.extras

conn = psycopg2.connect(dbname='', user='', password='', host='localhost')

cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
for i in range(23480):
    cur.execute( "select users.*, %s as testarr from users where users.id=%s", ([1,2,3],0) )
    for row in cur:
        assert row["login"] == 'root'
        assert isinstance(row['testarr'], list)

conn.close()


# time python3 python.py 

real	0m4.350s
user	0m1.572s
sys	0m0.444s

#!/usr/bin/ruby

require 'pg'

begin

    con = PG.connect :dbname => '', :user => '', :password => ''
    arr_dec = PG::TextDecoder::Array.new()
    23480.times do
        rs = con.exec_params "select users.*, $1 as testarr from users where users.id=$2", [[1,2,3], 0]
        rs.each do |row| 
            raise "assert failed 1" unless row["login"] == 'root' 
            raise "assert failed 2" unless arr_dec.decode(row["testarr"]).kind_of?(Array) 
        end
    end

rescue PG::Error => e

    puts e.message 
    
ensure

    con.close if con
    
end

# time ruby ruby.rb 

real	0m3.193s
user	0m0.528s
sys	0m0.188s