У меня есть основанная на правилах система с несколькими сотнями тысяч фактов, и у меня очень низкая производительность с PyCLIPS только для загрузки фактов.
Я сузил его до простого примера с двумя шаблонами и одним правилом, которое их объединяет (и больше ничего не делает):
import clips
import timeit
env = clips.Environment()
env.BuildTemplate('F1', '(slot x (type INTEGER))')
env.BuildTemplate('F2', '(slot x (type INTEGER))')
env.BuildRule('Rule1', '(F1 (x ?val)) (F2 (x ?val))', '')
N = 20000
with open('F1.txt', 'w') as f1:
with open('F2.txt', 'w') as f2:
for n in xrange(N):
print >>f1, '(F1 (x {}))'.format(n)
print >>f2, '(F2 (x {}))'.format(n)
print timeit.timeit(lambda : env.LoadFacts('F1.txt'), number=1)
print timeit.timeit(lambda : env.LoadFacts('F2.txt'), number=1)
Вывод:
0.0951321125031
14.6272768974
Таким образом, загрузка второй партии из 20 тысяч фактов занимает 14,6 секунды. Загрузка тех же файлов фактов из консоли CLIPS происходит мгновенно. Проверка различных значений N
показывает, что время загрузки примерно пропорционально sqr(N)
(что делает его совершенно непригодным для большого количества фактов).
Изменение порядка операций и определение правила после загрузки фактов не улучшают ситуацию (очевидно, что последняя операция всегда является медленной).
Кто-нибудь знаком с этой проблемой? Я неправильно использую PyCLIPS?
Я бегаю PyCLIPS v1.0.7.348
и CLIPS v6.3
.