「問題」は、MySQLのdecimal型からpythonのdecimal.Decimalに発生する型変換であるように思われます。これは、MySQLdb、pymysql、およびpyodbcがデータに対して行うものです。 MySQLdbのconverters.pyファイル(最後の行)を次のように変更します。
conversions[FIELD_TYPE.DECIMAL] = float
conversions[FIELD_TYPE.NEWDECIMAL] = float
10進数の代わりに。Decimalは問題を完全に解決しているようで、次のコードがあります:
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)
1秒未満で実行されます!おかしいのは10進数です。10進数がプロファイラーの問題であるようには見えませんでした。
同様のソリューションがpymysqlパッケージで機能するはずです。 pyodbcはもっと注意が必要です。すべてC++で記述されているため、パッケージ全体を再コンパイルする必要があります。
更新
MySQLdbのソースコードを変更する必要のないソリューションは次のとおりです。
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)
200k x 9テーブルの読み込みでMATLABを最大4倍上回ります!