pymysql vs. pyodbc - pymysql 是 slooooooooooooow

Posted

技术标签:

【中文标题】pymysql vs. pyodbc - pymysql 是 slooooooooooooow【英文标题】:pymysql vs. pyodbc - pymysql is sloooooooooooow 【发布时间】:2011-05-04 05:53:16 【问题描述】:

我在尝试让使用 mysql 的简单数据分析程序正常工作时遇到问题。

在我的 Windows 7 计算机上,我使用 pyodbc 并且程序运行良好,使用 pyodbc 连接到 MySQL。在 Snow Leopard 上,无法正确安装 pyodbc,所以我改用 pymysql...

在终于让pymysql工作后,它运行的超级慢……

刚刚做了一个测试——通过 cProfile 在 Mac OS Snow Leopard 上运行我的程序,得到:

26849449 个函数调用(26844794 个原始调用)在 103.196 CPU 秒内

...(总时间超过几秒的唯一方法是recv)

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   176088   76.960    0.000   76.960    0.000 method 'recv' of '_socket.socket' objects

...

使用 pyodbc 在 Windows 7 虚拟机上运行相同的程序(连接到从主机运行的相同 MySQL 数据库):

将 Muncher 作为主程序执行。 ncalls tottime percall cumtime percall filename:lineno(function) 在 6.849 CPU 秒内完成 512873 次函数调用(508218 次原语调用)

有人知道是什么原因造成的吗?看起来大部分时间都花在了 _socket.socket 的“recv”方法上,根据谷歌的说法,这是接收数据的东西。这种方法是坏的还是什么?看起来很荒谬,这需要将近 15 倍的时间。

我想一个更好的问题可能是......在 Mac OS 上连接到 MySQL 的最佳方式是什么?到目前为止,我已经尝试过 pyodbc 和 MySQLdb,但没有成功安装它们。

【问题讨论】:

我点击此链接brambraakman.com/blog/comments/… 将 MySqlDb 安装在 Mac OS 上并为我工作 【参考方案1】:

首先你应该确保你实际上是在比较相同的东西。

sockets 'recv' 方法意味着程序正在等待某些东西,因此如果您的程序实际上在 W7 机器和 Mac 上执行相同的操作,这可能意味着网络延迟不同。 (例如,如果您的 Mac 使用无线网络,而 Windows 7 机器使用有线网络)

为了排除您可以尝试在 Windows 机器上比较 pyodbc 和 pymysql。那么,您仍然会获得相同的速度差异吗?

通常,如果大部分时间都花在“recv”上,那么问题就出在您的应用程序之外(以及 pyodbc/pymysql 之外)。

【讨论】:

以上是关于pymysql vs. pyodbc - pymysql 是 slooooooooooooow的主要内容,如果未能解决你的问题,请参考以下文章

pymysql用法

pymysql 模块的使用

pymysql 模块的引用

pymysql 基操全套

mysql pymysql 模块

Python中pymysql基本使用