История изменений
Исправление
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