Форум сайта python.su
В “Rapid GUI Programming with Python and Qt” Саммерфильда в главе про СУБД прочитал: "…these applications are run for the very first time they create a database of fake records which they then use on subsequent runs. Generating these records using Qt’s built-in SQLite is fast on Linux but very slow on some Windows machines." Это про программку, создающую небольшую демо-базу, обыкновенными INSERT'ами, вроде бы. Так и есть, на ~100 записей секунд 15-20 уходит.
Вопрос: а почему очень медленно под Windows? sqlite для Windows какой-то неполноценный штоле? А?
Офлайн
inserts в одну транзакцию класть не пробовали?
Офлайн
Андрей СветловНе пробовал, но вопрос не в том. Почему отдельные то insert'ы медленнее на винде? В этой книжке аж 2 раза сообщается, как само собой разумеющееся: вот, сейчас мы запишем несколько строк в sqlite табличку, но имейте в виду, что на линуксе это будет быстро, а вот на некоторых windows системах это будет очень медленно. И действительно, запускаю этот же пример (assetmanager.py) на убунте, даже для 100 записей разница в скорости заметна, и замерять не надо. Но почему? На сайте sqlite роюсь, ну ни слова там про то, что виндовый порт какой то особенный, “медленный”.
inserts в одну транзакцию класть не пробовали?
Отредактировано (Окт. 21, 2009 02:09:10)
Офлайн
Не знаю, что и почему у вас медленно.
import os
import sqlite3
os.unlink('example.db')
conn = sqlite3.connect('example.db')
conn.execute('''create table t (id int, txt text)''')
conn.commit()
c = conn.cursor()
import time
t1 = time.time()
for i in xrange(10000):
c.execute('insert into t (id, txt) values (%d, %r)' % (i, i))
conn.commit()
print time.time() - t1
conn.close()
Офлайн
Вообще то очень много зависит от файловой системы. Пробовал на Фат32 и НТФС разница между ними несколько десятков секунд, в пользу НТФС, при вставке 10 000 записей и в 100 полей:)
Офлайн
u4upyПотому что большие норвежские тролли не любят виндовс. И правильно делают.
Но почему?
Офлайн
Как поменять название темы? SQLite совсем невиноватый оказался. Хочу переименовать тему на “Qt, медленный и лживый”, но не знаю как.
import os
import time
import sys
from PyQt4.QtSql import *
from PyQt4.QtGui import *
filename = "db"
if os.path.exists(filename):
os.unlink(filename)
app = QApplication(sys.argv) #?
db = QSqlDatabase.addDatabase("QSQLITE")
print db.lastError().text()
db.setDatabaseName(filename)
db.open()
q = QSqlQuery()
q.exec_("""CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
number INTEGER NOT NULL)""")
t = time.time()
for i in xrange(100):
q.exec_("INSERT INTO test (number) VALUES ('%s')" % i)
print time.time() - t
q.clear()
db.close()
app = QApplication(sys.argv)
db = QSqlDatabase.addDatabase("QSQLITE")
Офлайн
ZZZВаша реплика ценна?u4upyПотому что большие норвежские тролли не любят виндовс. И правильно делают.
Но почему?
Офлайн
u4upy
У меня на Висте SP1, NTFS ваш код занимал полсекунды-секунду. Тоже не фонтан, но все не настолько плохо.
QApplication нужен прежде всего для того, чтобы работали слоты/сигналы. Не нужны GUI - используйте QtCore.QCoreApplication.
Вообще-то Qt - это “вещь в себе”. За что недолюбливаю - а деваться некуда. Там все свое - и xml, и сокеты. Последнее особенно доставляет.
Большая часть PyQt кода, который я видел - использовала GUI и успешно забивала на все остальные чудеса. У Питона есть вполне достаточно “родных” средств для сетевых коммуникаций, например.
Офлайн
u4upyТам кажется улыбка…
Ваша реплика ценна?
u4upyДело в том, что кроссплатформенность, понятие очень относительное. На самом деле кроссплатформенных программ нет. И никогда не было. Например посмотрите на работу такой программы:
Тема о соответствии ПО тому, что у него в фичах прописано. Например кроссплатформенность. Когда одно и то же в разных средах одинаково работает. И при чем здесь любовь? И что тут правильного? А?
print 'Здравствуй мир!'
u4upyХм… А транзакцию руками открыть не пробовали?
Windows: ~10 секунд
Kubuntu: ~1 секунда
Это всего лишь 100 записей.
u4upyПравильно. Драйвера БД, как и прочие плагины, подгружаются при создании QtCore.QCoreApplication, дитятькой которого и является QtGui.QApplication.
получим ‘Driver not loaded’.
Андрей СветловПри всей моей любви к Qt, полностью согласен. Но он всё-таки не для питона написан. Для си_с_плюшками оно удобно.
Там все свое - и xml, и сокеты. Последнее особенно доставляет.
Отредактировано (Окт. 21, 2009 22:29:36)
Офлайн