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的主要内容,如果未能解决你的问题,请参考以下文章