首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python5x比perl mySql查询慢

Python5x比perl mySql查询慢
EN

Stack Overflow用户
提问于 2014-11-06 15:55:34
回答 5查看 1.8K关注 0票数 5

我正在将一个代码从perl转换到python。即使它的工作方式完全相同,但在python中有一部分代码比perl慢5倍,我不知道为什么。

perl和python都在同一台机器中,以及mysql数据库中。

代码查询db以下载表的所有列,然后处理每一行。有超过500万行要处理,最大的问题是从数据库检索数据到python处理。

在这里,我附加了两个代码示例: Python:

代码语言:javascript
复制
import os
import mysql.connector **<--- import mySqlDb**
import time

outDict = dict()
## DB parameters
db = mysql.connector.connect **<----- mySqlDb.connect( ...** 
     (host=dbhost, 
user=username, # your username
passwd=passw, # your password
db=database) # name of the data base
cur = db.cursor(prepared=True)
sql = "select chr,pos,lengthofrepeat,copyNum,region from db.Table_simpleRepeat;"
cur.execute(sql)
print('\t eDiVa public omics start')
s  = time.time()
sz = 1000
rows = cur.fetchall()
for row in rows:
    ## process out dict    
print time.time() - s 
cur.close()
db.close()        

而Perl对应的脚本则出现了:

代码语言:javascript
复制
use strict;
use Digest::MD5 qw(md5);
use DBI;
use threads;
use threads::shared;

my $dbh = DBI->connect('dbi:mysql:'.$database.';host='.$dbhost.'',$username,$pass) 
    or die "Connection Error!!\n";    
    my $sql = "select chr,pos,lengthofrepeat,copyNum,region from   db.Table_simpleRepeat\;";
    ## prepare statement and query
    my $stmt = $dbh->prepare($sql);
    $stmt->execute or die "SQL Error!!\n";
    my $c = 0;
    #process query result
    while (my @res = $stmt->fetchrow_array) 
    {
        $edivaStr{ $res[0].";".$res[1] } = $res[4].",".$res[2]; 
        $c +=1;
    }
    print($c."\n");
    ## close DB connection
    $dbh->disconnect();    

这两个脚本的运行时是:

  • Perl脚本的~40
  • Python脚本的~200 s

我不知道为什么会发生这种情况,我尝试使用fetchone()或out ch多()来查看是否存在内存问题,但运行时最多比200的运行时减少了10%。

我的主要问题是理解为什么这两个功能等价的代码块之间存在着相关的性能差异。

任何关于我如何证实正在发生的事情的想法都将是非常感谢的。

谢谢!

关于解决方案的更新

Peeyush的评论可能是一个答案,我希望他能够发布它,因为它让我找到了一个解决方案。

问题是python连接器。我刚刚对mySqlDb模块进行了更改,这是一个C编译模块。这使得python代码略快于perl代码。

我在python代码中添加了一个<- "“,以说明获得性能是多么容易。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-11-14 14:10:36

问题是python连接器。我刚刚对mySqlDb模块进行了更改,这是一个C编译模块。这使得python代码略快于perl代码。

我在python代码中添加了一个<- "“-以显示获得性能是多么容易

票数 2
EN

Stack Overflow用户

发布于 2014-11-06 16:03:06

cursor.fetchall意味着您一次将所有数据加载到内存中,而不是在需要时缓慢执行。

替换

代码语言:javascript
复制
row = cur.fetchall()
for row in rows:

通过

代码语言:javascript
复制
for row in cur:
票数 4
EN

Stack Overflow用户

发布于 2017-11-24 18:28:31

我也遇到了同样的问题。使用Python,这里是我的环境性能统计- Python需要很长时间才能连接到Oracle。

  • 连接到DB,elaps:0.38108
  • 运行查询,elaps:0.00092
  • 从表中获取文件名,表号:8e-05
  • 运行查询读取BLOB,elaps:0.00058
  • 解压缩数据并写入文件,elaps:0.00187
  • 关闭DB连接,elaps:0.00009
  • Over,elaps:0.38476
  • 与Perl中的相同函数,elaps:0.00213
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26783735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档