Факт загружается очень медленно с PyCLIPS, но быстро с CLIPS

У меня есть основанная на правилах система с несколькими сотнями тысяч фактов, и у меня очень низкая производительность с 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.


person Uri Barkai    schedule 29.06.2014    source источник


Ответы (1)


CLIPS 6.3 использует хеширование в соединениях, которые сравнивают переменные из одного шаблона в другой. Это может значительно улучшить производительность, когда есть большое количество фактов и правил, подобных тем, что в вашем примере. В предыдущих версиях CLIPS, когда утверждается новый факт F1, итерация будет происходить по всем фактам F2, соответствующим второму шаблону (и аналогичная итерация будет происходить для каждого нового факта F2). В версии 6.3 итерация происходит только с фактами, хэшированными в одну и ту же корзину для значения? Val. На странице Readme на веб-сайте PyCLIPS указано, что он скомпилирован с помощью CLIPS 6.24, поэтому это объясняет разницу в производительности. Навскидку я не припомню каких-либо существенных различий в API между 6.24 и 6.3, поэтому можно будет перекомпилировать PyCLIPS с более новой версией CLIPS, чтобы получить улучшения производительности.

person Gary Riley    schedule 29.06.2014
comment
С 'CLIPS (V6.24 06/15/06)' эквивалентный сценарий CLIPS также работает медленно на шаге (load-facts F2.txt). Итак, да, проблема связана с версией CLIPS, а не с интерфейсом PY. - person hpaulj; 29.06.2014
comment
Есть ли исходный код для CLIPS 6.3, который легко компилируется в Linux (debian / Ubuntu)? Я вижу установщики для Windows и Mac (а также порты для Java и Android). - person hpaulj; 30.06.2014
comment
Спасибо. К сожалению, PyCLIPS не компилируется с CLIPS 6.30 из-за нескольких изменений API. Я постараюсь разобраться. - person Uri Barkai; 30.06.2014
comment
Вот патч PyCLIPS, который поддерживает компиляцию с помощью CLIPS 6.3. - person Uri Barkai; 24.07.2014