我正在将一个代码从perl转换到python。即使它的工作方式完全相同,但在python中有一部分代码比perl慢5倍,我不知道为什么。
perl和python都在同一台机器中,以及mysql数据库中。
代码查询db以下载表的所有列,然后处理每一行。有超过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() 而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(); 这两个脚本的运行时是:
我不知道为什么会发生这种情况,我尝试使用fetchone()或out ch多()来查看是否存在内存问题,但运行时最多比200的运行时减少了10%。
我的主要问题是理解为什么这两个功能等价的代码块之间存在着相关的性能差异。
任何关于我如何证实正在发生的事情的想法都将是非常感谢的。
谢谢!
关于解决方案的更新
Peeyush的评论可能是一个答案,我希望他能够发布它,因为它让我找到了一个解决方案。
问题是python连接器。我刚刚对mySqlDb模块进行了更改,这是一个C编译模块。这使得python代码略快于perl代码。
我在python代码中添加了一个<- "“,以说明获得性能是多么容易。
发布于 2014-11-14 14:10:36
问题是python连接器。我刚刚对mySqlDb模块进行了更改,这是一个C编译模块。这使得python代码略快于perl代码。
我在python代码中添加了一个<- "“-以显示获得性能是多么容易
发布于 2014-11-06 16:03:06
cursor.fetchall意味着您一次将所有数据加载到内存中,而不是在需要时缓慢执行。
替换
row = cur.fetchall()
for row in rows:通过
for row in cur:发布于 2017-11-24 18:28:31
我也遇到了同样的问题。使用Python,这里是我的环境性能统计- Python需要很长时间才能连接到Oracle。
https://stackoverflow.com/questions/26783735
复制相似问题