Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Python2.7 pyodbc或pymssql与R RODBC_Performance_Python 2.7_Pandas_Pyodbc_Pymssql - Fatal编程技术网

Performance Python2.7 pyodbc或pymssql与R RODBC

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

我正在尝试将R代码迁移到Python2.7,以便对两者进行比较。我遇到的第一个问题是当我尝试进行odbc连接时。R比python快得多,但是因为我是python的新手,所以我不确定是否使用了正确的包

我在信中写道:

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都允许您配置此参数

现在,如果您想将苹果与苹果进行比较:

  • 使用相同的基础设施:相同的远程数据库、相同的本地客户端、中间相同的网络
  • 使用相同的ODBC层:相同的驱动程序管理器、相同的驱动程序、相同的DSN
  • 使用R和python为每个fetch循环检索完全相同的行数请注意:如果您不说任何话,RODBC的sqlQuery()将一次获取100行 我确实使用这种方法将RODBC和pyodbc与三种不同的数据库(不包括SQL Server)进行了比较,我总是发现它们的性能具有可比性

    以下是R代码:

    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
    ... 
    >>>