SQLAlchemy 0.9 dialects speed tests

Posted: [Source]
Tags:  mysql postgresql python sqlalchemy

This fourth SQLAlchemy's dialects speed tests aims to test this ORM's newest version, 0.9.x, which is available for about a month already. This version, amongst other improvements, contains C extension for python3.

There are six dialects tested like previously: 3 for postgres: psycopg2, pypostgresql, pg8000 and 3 for mysql: mysqldb (mysql-python), oursql and mysqlconnector (mysql-connector-python).

My basic setup:

  • System: Ubuntu 13.10 64bit

  • Python: Python 2.7.5+/Python 3.3.2+

  • SQLAlchemy: 0.9.1

Connectors versions used were:

  • oursql: 0.9.3.1

  • mysql-connector-python: 1.1.4 (new)

  • mysqldb: 1.2.5 (new)

  • psycopg2: 2.5.2 (new)

  • pg8000 1.9.4 (new)

  • py-postgresql: 1.1.0

Most major packages had seen patch updates since the last test, with mysql-connector-python seeing a minor update.

Tests run, were the five tests as previously:

  • Insert with rollback

  • Insert with commit

  • Select

  • Delete with rollback

  • Delete with commit

I had to extend run.sh of my test suite script to facilitate the fact, that the mysql-connector-python is not hosted on pypi.

Test results

s/run 1

s/run 10

s/run 100

psycopg2

0.049

0.199

1.746

psycopg2 (py3)

0.048

0.202

1.762

pg8000

0.194

0.746

6.450

pg8000 (py3)

0.196

0.760

6.397

py-postgresql (py3)

0.127

0.532

4.827

MySQLdb

0.069

0.368

2.850

Connector

0.066

0.438

3.489

Connector (py3)

0.070

0.449

3.846

Oursql

0.102

0.422

3.539

Table: Insert with rollback

Like before, no real difference between python2 and python3 able connectors. With psycopg2 still the fastest of all (even mysql) and pg800 being about 50% slower than py-postgresql. MySQLdb as usual leads within MySQL connectors, with Mysql-connector-python close by.

s/run 1

s/run 10

s/run 100

psycopg2

0.063

0.226

2.187

psycopg2 (py3)

0.113

0.392

1.979

pg8000

0.227

1.119

6.682

pg8000 (py3)

0.331

0.815

6.632

py-postgresql (py3)

0.151

0.684

5.079

MySQLdb

0.055

0.325

2.521

Connector

0.061

0.353

3.452

Connector (py3)

0.068

0.420

3.700

Oursql

0.083

0.394

3.741

Table: Insert with commit

Not much different for insert with commit, although this operation is taking longer for all connectors. Oursql passed all tests this time.

s/run 1

s/run 10

s/run 100

psycopg2

0.019

0.029

0.118

psycopg2 (py3)

0.018

0.027

0.116

pg8000

0.079

0.109

0.198

pg8000 (py3)

0.078

0.088

0.198

py-postgresql (py3)

0.046

0.059

0.139

MySQLdb

0.026

0.035

0.119

Connector

0.036

0.043

0.133

Connector (py3)

0.036

0.045

0.140

Oursql

ERROR

ERROR

ERROR

Table: Select test

Not much change since last time I presented results for this test, except mysql-connector-python gets on-par between different python versions.

s/run 1

s/run 10

s/run 100

psycopg2

0.033

0.033

0.043

psycopg2 (py3)

0.032

0.032

0.040

pg8000

0.163

0.164

0.180

pg8000 (py3)

0.163

0.180

0.171

py-postgresql (py3)

0.118

0.121

0.145

MySQLdb

0.045

0.064

0.144

Connector

0.067

0.095

0.306

Connector (py3)

0.074

0.064

0.086

Oursql

ERROR

ERROR

ERROR

Table: Delete with rollback

Again, quite an improvement for mysql-connector-python on python3 here. Other differences could be attributed to network.

s/run 1

s/run 10

s/run 100

psycopg2

0.081

0.081

0.106

psycopg2 (py3)

0.046

0.049

0.058

pg8000

0.480

0.386

0.388

pg8000 (py3)

0.280

0.300

0.303

py-postgresql (py3)

0.152

0.156

0.229

MySQLdb

0.047

0.061

0.193

Connector

0.074

0.062

0.120

Connector (py3)

0.066

0.063

0.232

Oursql

ERROR

ERROR

ERROR

Table: Delete with commit

When committing a delete operation, psycopg2 seems to perform better on python3 than python2.

Summarizing

There are some overall improvements when it comes to mysql-connector-python performance, but still, MySQLdb takes the lead for MySQL connectors. Still postgres' psycopg2 seems to perform better in most cases, and works on python3 as well. Oursql made it one step further without any work on the package.

Surprisingly, there isn't any speedup I could attribute to SQLAlchemy's C extensions being enabled on python3, although, I was hoping for one. Mysql-connector-python could be rather attributed to some mjor work done to it.

Tests code

Test code can be checked here github.com/fizyk/sqlalchemy-tests. Requirement for it is to have virtualenvwrapper installed, and script itself should create clean envirtonments and install required dependeincies for tets.

Got some ideas on moving this code to py.test based tests with some logger fixture to produce pre-rendered reports.

Comments powered by Disqus