【发布时间】:2016-03-08 22:09:26
【问题描述】:
我在 Raspberry PI 3 上使用 PonyORM 作为我的 SQLite 数据库的 ORM 和 Python 3.5(不是你能想象到的最快的设备,但它不应该那么糟糕)。
某些操作,例如插入,似乎非常慢。一次插入包含 3 个短字符串的实体可能需要 4 - 10 秒。
这是我的 datamodel.py 文件:
from pony.orm import *
from datetime import datetime
db = Database('sqlite', 'website.db', create_db = True)
class User(db.Entity):
login = Required(str, unique=True)
password = Required(str)
actions = Set("Event")
class Event(db.Entity):
description = Optional(str)
date = Required(datetime)
ip = Required(str)
user = Optional(User)
db.generate_mapping(create_tables = True)
我还创建了一个非常简单的性能测试:
from datamodel import *
from datetime import *
sql_debug(True)
totalTime = datetime.now()
with db_session:
constructTime = datetime.now()
Event(date = datetime.now(),
ip = '0.0.0.0',
description = 'Sample event!')
constructTime = datetime.now() - constructTime
totalTime = datetime.now() - totalTime
print(constructTime)
print(totalTime)
它的样本结果:
GET NEW CONNECTION
BEGIN IMMEDIATE TRANSACTION
INSERT INTO "Event" ("description", "date", "ip", "classtype") VALUES (?, ?, ?, ?)
['Sample event!', '2016-03-08 23:05:15.066742', '0.0.0.0', 'Event']
COMMIT
RELEASE CONNECTION
0:00:00.000479
0:00:04.808138
SQL 查询字符串打印得很快,所以我猜这里的翻译不是问题,但是正如你所看到的,整个操作需要几秒钟。
这可能是什么原因?有什么办法可以改善这个荒谬的长时间吗?
【问题讨论】:
-
自行实现的时序算法不是可靠的数据点。
-
@cricket_007 你是否认为我的时间测量方法不好?好吧,也许您是对的,也许它不准确,但是无论如何,当它冻结几秒钟以将数据插入数据库时,实际应用中就会出现问题。
-
我只是说在一台计算机上进行多次有限的运行并不是很可靠,因为声称存在很大的速度差异。不过,ORM 通常比原始查询慢得多。
-
@cricket_007 我并不是说 ORM 和原始查询之间存在或没有区别,我还没有测试过。有问题的 SQL 查询是由 ORM 生成的输出,它在启动程序后可能不到一秒钟就出现在屏幕上,但这只是我的观察,我不知道如何在 Python 中测量。
-
好吧,您的
totalTime包括打开和关闭db_session资源并进行一些日期数学运算的时间(并不是那些很慢)。我想你看到的高是打开、插入和关闭操作加在一起