"Masalah" tampaknya adalah konversi tipe yang terjadi dari tipe desimal MySQL ke desimal python. Desimal yang dilakukan MySQLdb, pymysql, dan pyodbc pada data. Dengan mengubah file converters.py (di baris terakhir) di MySQLdb menjadi:
conversions[FIELD_TYPE.DECIMAL] = float
conversions[FIELD_TYPE.NEWDECIMAL] = float
alih-alih desimal.Desimal tampaknya benar-benar menyelesaikan masalah dan sekarang kode berikut:
import MySQLdb
import numpy
import time
t = time.time()
conn = MySQLdb.connect(host='',...)
curs = conn.cursor()
curs.execute("select x,y from TABLENAME")
data = numpy.array(curs.fetchall(),dtype=float)
print(time.time()-t)
Berjalan dalam waktu kurang dari satu detik! Yang lucu, desimal. Desimal tampaknya tidak pernah menjadi masalah di profiler.
Solusi serupa harus bekerja dalam paket pymysql. pyodbc lebih rumit:semuanya ditulis dalam C++, maka Anda harus mengkompilasi ulang seluruh paket.
PERBARUI
Berikut adalah solusi yang tidak perlu mengubah kode sumber MySQLdb:Python MySQLdb mengembalikan datetime.date dan desimal Solusinya kemudian memuat data numerik ke dalam panda:
import MySQLdb
import pandas.io.sql as psql
from MySQLdb.converters import conversions
from MySQLdb.constants import FIELD_TYPE
conversions[FIELD_TYPE.DECIMAL] = float
conversions[FIELD_TYPE.NEWDECIMAL] = float
conn = MySQLdb.connect(host='',user='',passwd='',db='')
sql = "select * from NUMERICTABLE"
df = psql.read_frame(sql, conn)
Mengalahkan MATLAB dengan faktor ~4 dalam memuat tabel 200k x 9!