我正在将代码从perl转换为python.即使它的工作方式完全相同,但有一部分代码在python中比在perl中慢5倍,我无法弄清楚原因.
perl和python都在同一台机器上,以及mysql数据库.
代码查询数据库以下载表的所有列,然后处理每一行.有超过500万行要处理,最大的问题是从数据库中检索数据到python处理.
这里我附上两个代码示例:Python:
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()
Run Code Online (Sandbox Code Playgroud)
虽然这里有Perl等效脚本:
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();
Run Code Online (Sandbox Code Playgroud)
这两个脚本的运行时是:
我无法弄清楚为什么会发生这种情况[我尝试使用fetchone()或fetchmany()来查看是否存在内存问题,但运行时最多会从200秒减少10%].
我的主要问题是理解为什么在两个功能等同的代码块之间存在这样的相关性能差异.
任何关于如何验证正在发生的事情的想法将不胜感激.
谢谢!
Peeyush的评论可能是一个答案,我希望他发布它,因为它让我找到了解决方案.
问题是python连接器.我刚刚为mySqlDb模块更改了它,这是一个C编译模块.这使得python代码比perl代码略快.
我在python代码中添加了一个带有<----""的更改,以显示获得性能的难易程度.
问题是 python 连接器。我刚刚对 mySqlDb 模块进行了更改,它是一个 C 编译模块。这使得 python 代码比 perl 代码稍微快一些。
我用 <---- "" 在 python 代码中添加了更改,以显示获得性能是多么容易