Performance Python2.7 pyodbc或pymssql与R RODBC
我正在尝试将R代码迁移到Python2.7,以便对两者进行比较。我遇到的第一个问题是当我尝试进行odbc连接时。R比python快得多,但是因为我是python的新手,所以我不确定是否使用了正确的包 我在信中写道:Performance Python2.7 pyodbc或pymssql与R RODBC,performance,python-2.7,pandas,pyodbc,pymssql,Performance,Python 2.7,Pandas,Pyodbc,Pymssql,我正在尝试将R代码迁移到Python2.7,以便对两者进行比较。我遇到的第一个问题是当我尝试进行odbc连接时。R比python快得多,但是因为我是python的新手,所以我不确定是否使用了正确的包 我在信中写道: ptm <- proc.time() require(RODBC) dbXX <- odbcDriverConnect('driver={SQL Server}; server=s001111;database=XX;trusted_connection=true
ptm <- proc.time()
require(RODBC)
dbXX <- odbcDriverConnect('driver={SQL Server};
server=s001111;database=XX;trusted_connection=true')
rech<-sqlQuery(dbXX, "select top 10000* from XX.dbo.table ", as.is=T)
proc.time() - ptm
我已经下载了Anaconda for python 2.7 windows 7 64。
因此,我在Spyder中写道:
import pyodbc
import pandas
from pandas.io.sql import read_frame
sql = 'select top 10000 * from XX.dbo.table'
cnn = pyodbc.connect('DRIVER={SQL Server};SERVER=s001111;DATABASE=XX;Trusted_Connection=yes')
start = time.time()
data=pd.read_sql(sql,cnn)
end = time.time()
print(end - start)
这需要6.35秒
我也尝试过pymssql:
import pymssql
conn = pymssql.connect(server='s001111', database='XX')
start = time.time()
data=pd.read_sql(sql,conn)
end = time.time()
print(end - start)
这需要38.3秒
真正的查询需要读取一个维度为220.000行乘353列的表,并应用一个过滤器(带where)
我只需要从数据库中提取数据
在Python2.7中有没有更快的方法
我发现了,但我想如果是SQL问题,在R中也会这样做,不是吗
我也发现了这个:但它不是免费的
此时,我想知道问题是ODBC连接还是熊猫本身,因此我尝试:
cur = conn.cursor();
start = time.time()
cur.execute(sql);
tabla=cur.fetchall()
end = time.time()
print(end - start)
但花了29.29秒
那么,R从SQL Microsoft DB检索数据的速度怎么可能比Python快得多呢?RODBC和pyodbc可能会花费大部分时间将数据从数据库服务器传输到用于运行查询的本地计算机。这里一个非常重要的参数是,对于每个fetch循环,从db服务器移动到本地计算机的行数。RODBC和pyodbc都允许您配置此参数 现在,如果您想将苹果与苹果进行比较:
library(RODBC)
ch <- odbcConnect("DWN",uid="xyz",pwd="xyz",rows_at_time=1024);
ds <- sqlQuery(ch,"select * from large_table limit 100000");
性能可能非常依赖于您使用的驱动程序。我建议尝试另一个驱动程序,看看这是否表现更好。例如,备选方案是
pymssql
()。另请参见此处的列表:进一步,小注释:read\u frame
已被弃用,您应该改用pd.read\u sql
。我还建议使用SQLAlchemy
来指定连接(但这与您使用的驱动程序无关)。见@joris谢谢!我已经下载了康达pymssql。还编写了代码并运行了它。如何测量每个库所需的时间?我认为它仍然比R代码花费更多的时间。。。这可能吗?那当然可能。如果您使用的是IPython,您可以使用%time
(例如%time pd.read_sql(…)
)计算命令所需时间。如果您想测试问题是pyodbc还是pandas本身,您可以通过计时cur=conn.cursor()来计算查询本身所需时间;当前执行(sql);cur.fetchall()
并将其与使用pandas获取此查询的时间进行比较
library(RODBC)
ch <- odbcConnect("DWN",uid="xyz",pwd="xyz",rows_at_time=1024);
ds <- sqlQuery(ch,"select * from large_table limit 100000");
>>> import pyodbc
>>> ch = pyodbc.connect('DSN=xyz;UID=xyz;PWD=xyz')
>>> curs = ch.cursor()
>>> curs.execute("select * from large_table limit 100000")
>>> while True:
... rows = curs.fetchmany(1024)
... if not rows:
... break
...
>>>